【XIAOJUSURVEY& 北大】Authorization 实现 - server 源码阅读分析
![【XIAOJUSURVEY&北大】Authorization实现 - server源码阅读分析](https://static001.geekbang.org/infoq/89/8990ed6fe9909cfb0f61d974b90221c2.png)
Authentication 交互流程图
![](https://static001.geekbang.org/infoq/94/94f1a7cb0072836065fec6d46d5d331d.png)
源码分析
1、登录
src/modules/auth/controllers/auth.controller.ts
登录 controller 实现:接受用户 request,处理未注册、用户名密码不一致等错误,并调用 JWT 生成服务。
2、JWT
src/modules/auth/services/auth/service.ts
负责 JWT 生成和验证。
JWT(JSON Web Token)是一种用于在不同服务之间安全传输信息的开放标准。服务器完成认证后,生成一个 JWT 传回给用户,在后续的通信中,用户一律需要携带 JWT 作为其身份验证,服务端无需保存任何其他的 session 信息,只需验证 JWT 是否有效即可完成鉴权。
JWT 的组成为:
header(头部)
alg:表示签名的算法。默认是 HS256。
typ:JWT 的类型统一为 JWT
payload(负载)
iss:签发人
exp:过期时间
sub:主题
aud:受众
nbf:生效时间
iat:签发时间
jti:编号
以上是可以选用的官方字段。负载部分还可以定义私有字段。
signature(签名)
为了防止用户篡改数据,服务器会通过指定一个密钥(secret),使用 header 中指定的签名算法,根据 header+payload+secret 生成签名。
这三个部分通过 Base64URL 算法转为字符串之后,用.
作为分割,拼接为一个完整的字符串。可以注意到,虽然设置了签名防止数据篡改,但是 JWT 本身没有加密过程,因此不能在负载中放置隐私信息。
使用 jsonwebtoken,可以简单地完成 JWT 的生成和验证:
3、guards
src/guards/authentication.guard.ts
Guard 是 Nestjs 中的一种拦截器机制,用于在进入 controller 之前执行某些逻辑,可以用于身份验证、授权、数据校验等场景。在设定 Guard 时,需要完成一个实现了 CanActivate
接口的类,该接口输入请求的上下文信息,判断请求是否可以继续。在Authentication
Guard 中,Guard 用于确定用户身份有效。
src/modules/survey/controllers/survey.controller.ts
以获取问卷内容的 controller 为例:使用@UseGuards(Authentication)
装饰器,在 controller 级别执行用户鉴权。在实际执行获取问卷之前,以用户请求作为上下文,先执行Authentication
中的canActivate
方法,如果用户登陆状态无效,在 Guard 中就会抛出错误,无法进行下一步操作,以保证数据安全。
版权声明: 本文为 InfoQ 作者【XIAOJUSURVEY】的原创文章。
原文链接:【http://xie.infoq.cn/article/70b32cdfb47eca46822e3c6c2】。
本文遵守【CC BY-NC】协议,转载请保留原文出处及本版权声明。
评论