为了安全起见,设置token的时候我们都会用自己的私钥,然后别人调用验证的时候用公钥
那第一步肯定是先获取我们的公钥和私钥了
MAC和Windows不一样,我这里只说mac怎么获取…
创建一个文件夹,然后cd到这个文件夹里面
完成这几个命令即可
那第二步肯定是登陆时候返回token了
先安装我们的jwt插件
cnpm I jsonwebtoken --save
我把私钥弄成了一个环境变量
const PRIVATE_KEY = fs.readFileSync(path.resolve(__dirname,'./keys/private.key'));
然后开始设置token了
class AuthController {
async login(ctx, next) {
const { id, name } = ctx.user;
const token = jwt.sign({ id, name }, PRIVATE_KEY, {
expiresIn: 60 * 60, //过期时间
algorithm: 'RS256'
});
ctx.body = {
id,
name,
token
};
}
async success(ctx,next) {
ctx.body = '授权成功'
}
}
这样我们的token就可以返回了
那第三步肯定是验证了,比如我们调用一些接口,需要验证token才行
扫描二维码关注公众号,回复:
12659077 查看本文章

我把公钥也弄成了一个环境变量
const PUBLIC_KEY = fs.readFileSync(path.resolve(__dirname,'./keys/public.key'));
然后开始验证token
const verifyAuth = async (ctx,next) =>{
console.log('验证授权的middleware')
// 1.获取我们的token
const authorization = ctx.headers.authorization;
if(!authorization){
const error = new Error(errorTypes.UNAUTHORIZATION);
return ctx.app.emit('error',error,ctx);
}
const token = authorization.replace('Bearer ','');
// 2.验证token
try {
const res = jwt.verify(token,PUBLIC_KEY,{
algorithms:['RS256']
});
ctx.user = res;
await next();
} catch (err) {
const error = new Error(errorTypes.UNAUTHORIZATION);
ctx.app.emit('error',error,ctx);
}
}
设置错误代码,这两行是为了当没有token或者token过期时候给客户端返回的结果,你们可以先删掉
const error = new Error(errorTypes.UNAUTHORIZATION);
return ctx.app.emit('error',error,ctx);
OK,方法都封装好了,使用应该都会吧,把它当成中间件啊,类似这样
authRouter.get('/test',verifyAuth);