JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案
前置知识:
案例为了更简洁易懂,使用postman来代替前端界面请求接口。
下面案例通过登录接口/users/login
来获取token
代码:
const Koa = require('koa')
const Router = require('koa-router')
const jwt = require('jsonwebtoken')
const jwtKoa = require('koa-jwt')
const util = require('util')
const verify = util.promisify(jwt.verify)
const secret = 'test'
const app = new Koa()
const router = new Router()
app.use(bodyParser())
const bodyParser = require('koa-bodyparser')
app
.use(jwtKoa({secret}).unless({
path: [/^\/user\/login/]
}))
router
.post('/users/login', async (ctx, next) => {
const user = ctx.request.body
if(user && user.name) {
let userToken = {
name: user.name
}
const token = jwt.sign(userToken, secret, {expiresIn: '1h'}) //token签名 有效期
ctx.body = {
message: '获取token成功',
code: 1,
token
}
} else {
ctx.body = {
message: '参数错误',
code: -1
}
}
})
.get('/users/userinfo', async (ctx) => {
const token = ctx.header.authorization
let payload
if (token) {
payload = await verify(token.split(' ')[1], secret)
ctx.body = {
payload
}
} else {
ctx.body = {
message: 'token error',
code: -1
}
}
})
app
.use(router.routes())
.use(router.allowedMethods())
app.listen(3000, () => {
console.log('app listening 3000...')
})
一开始直接开始获取用户信息(也就是直接请求/users/userinfo接口):
显示无权限:
输入name值进行登录,点击postman的send按钮进行登录请求(也就是请求/users/login接口):
得到返回的token值(模拟用户登录成功,拿到了token)
拿到token以后再去请求用户信息接口(将token值放在get请求的header上作为标识,请求用户信息接口):
接口返回给我们该用户的name值(说明此时拿着token就可以成功请求/users/userinfo接口了)
然后就可以根据name值来查询用户信息以及用户权限,实现权限管理,也消除了http无状态的缺点,可以用来实现单点登录。