小程序登录功能实现(二)
实现JWT
步骤1:创建接口
在auth/auth/auth.go
定义token接口
1 | type TokenGenerator interface { |
在Service中加入TokenGenerator
1 | type Service struct { |
并在Login函数中使用
1 | tkn, err := s.TokenGenerator.GeneratorToken(accountID,7200) |
步骤2:实现接口
安装:
1 | go get github.com/dgrijalva/jwt-go |
创建/server/token/jwt.go
1 | type JWTTokenGen struct { |
步骤3:使用
将生产的私钥和公钥保存到文件里面
1 | // 读取私钥 |
1 | authpb.RegisterAuthServiceServer(s, &auth.Service{ |
验证Token
每个微服务都需要去验证token
步骤1:创建/shared/auth/tokentoken.go
1 | type JWTTokenVerifier struct { |
步骤2:表格测试
1 | const PublicKey = `-----BEGIN PUBLIC KEY----- |
Context
划分任务的边界
- Deadline:多久做完
- Cancel:取消
- Key—Value:传递值
- 任务生命周期:
- 同一个任务的步骤:共享同一个context
- 子任务:从但前的context造一个新的context,继承原有的context的所有参数。
- 后台任务:全新任务,不受当前context限制
登录拦截器
创建shared/auth/auth.go
:
1 | // 将拦截器的代码封装起来 |
注册拦截器:在一个启动的server中加入:
1 | // 公钥文件的位置 |
在需要登录权限的server加下面代码即可
1 | aid, err := auth.AccountIDFromContext(c) |
重构微服务代码
提取代码放到/shared/server/grpc.go
1 | type GRPCConfig struct { |
auth/main.go
修改为
1 | func main() { |
rental/main.go
修改为:
1 | func main() { |
客户端携带Token
步骤一:包装request请求,
1 | import camelcaseKeys from "camelcase-keys" |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WHui's blog!