一个简单的JWT使用示例
准备
npm i --save koa koa-route koa-bodyparser @koa/cors jwt-simple
服务端代码
const Koa = require("koa");const app = new Koa();const route = require('koa-route');var bodyParser = require('koa-bodyparser');const jwt = require('jwt-simple');const cors = require('@koa/cors');const secret = 'your_secret_string'; // 加密用的SECRET字符串,可随意更改app.use(bodyParser()); // 处理post请求的参数const login = ctx => { const req = ctx.request.body; const userName = req.userName; const expires = Date.now() + 3600000; // 设置超时时间为一小时后 var payload = { iss: userName, exp: expires }; const Token = jwt.encode(payload, secret); ctx.response.body = { data: Token, msg: '登陆成功' };}const getUserName = ctx => { const reqHeader = ctx.request.headers; const token = reqHeader.authorization.split(" ")[1]; var decoded = jwt.decode(token, secret); ctx.response.body = { data: { username: decoded.iss, }, msg: '获取用户名成功' };}app.use(cors());app.use(route.post('/login', login));app.use(route.get('/getUsername', getUserName));app.listen(3200, () => { console.log('启动成功');});
客户端代码
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>JWT-demo</title> <style> .login-wrap { height: 100px; width: 200px; border: 1px solid #ccc; padding: 20px; margin-bottom: 20px; } </style></head><body> <div class="login-wrap"> <input type="text" placeholder="用户名" class="userName"> <br> <input type="password" placeholder="密码" class="password"> <br> <br> <button class="btn">登陆</button> </div> <button class="btn1">获取用户名</button> <p class="username"></p></body><script> var btn = document.querySelector('.btn'); btn.onclick = function () { var userName = document.querySelector('.userName').value; var password = document.querySelector('.password').value; fetch('http://localhost:3200/login', { method: 'POST', body: JSON.stringify({ userName, password }), headers:{ 'Content-Type': 'application/json' }, mode: 'cors' // no-cors, cors, *same-origin }) .then(function (response) { return response.json(); }) .then(function (res) { // 获取到Token,将Token放在localStorage document.cookie = `token=${res.data}`; localStorage.setItem('token', res.data); localStorage.setItem('token_exp', new Date().getTime()); alert(res.msg); console.log('本地测试', res); }) .catch(err => { console.error('本地测试错误', err); }); } var btn1 = document.querySelector('.btn1'); btn1.onclick = function () { var username = document.querySelector('.username'); const token = localStorage.getItem('token'); fetch('http://localhost:3200/getUsername', { headers:{ 'Authorization': 'Bearer ' + token }, mode: 'cors' // no-cors, cors, *same-origin }) .then(function (response) { return response.json(); }) .then(function (res) { console.log('返回用户名结果', res); username.innerHTML = `姓名:${res.data.username}`; }) .catch(err => { console.error('本地测试错误', err); }); }</script></html>
运行代码
其他
以上只是一个特别简单的例子, 很多边界条件没有做处理,比如未登陆的校验,异常的处理,Token过期的判断;