-
公钥私钥的生成环境
- 在mac上面可以直接使用openssl
- 在Windows上面cmd无法使用openssl,但git bash上可以使用openssl
-
生成公钥私钥的方法
- 在git bash中输入openssl打开openssl交互式工具
- 生成私钥:genrsa -out private.key 1024(genrsa表示非对称加密,-out表示导出私钥,private.key表示私钥名称,1024表示私钥长度)
c. 通过私钥生成公钥:rsa -in private.key -pubout -out public.key
-
node中引入jwt:npm i jsonwebtoken
-
使用jwt生成token
const jwt = require('jsonwebtoken')//引入jwt
const { PRIVATE_KEY } = require('./../app/config')
class AuthController {
async login(ctx,next){
const { id, name } = ctx.user
const token = jwt.sign({id, name}, PRIVATE_KEY, {
expiresIn: 60*60*24, //过期时间一天
algorithm: 'RS256' //采用的算法
} )
ctx.body = {
id,
name,
token
}
}
}
module.exports = new AuthController()
- 实现验证token的中间件
const jwt = require('jsonwebtoken');
const errorType = require('../constants/error-types');
const { PUBLIC_KEY } = require('../app/config');
const verifyToken = async function(ctx,next){
//1.获取token
const authorization = ctx.headers.authorization;
const token = authorization.replace('Bearer ','');
//2.验证token
try {
const result = jwt.verify(token, PUBLIC_KEY, {
algorithms: ['RS256']
});
ctx.user = result;
console.log("user",result)
await next();
} catch (err) {
const error = new Error(errorType.UNAUTHORIZATION);
ctx.app.emit('error', error, ctx);
}
}
module.exports = {
verifyToken
}