前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(四):自动生成 API TS 类型

Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(四):自动生成 API TS 类型

作者头像
为少
发布2021-05-27 18:55:36
6360
发布2021-05-27 18:55:36
举报
文章被收录于专栏:黑客下午茶黑客下午茶

系列

  1. 云原生 API 网关,gRPC-Gateway V2 初探
  2. Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第一篇
  3. Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务:第二篇
  4. Go + gRPC-Gateway(V2) 构建微服务实战系列,小程序登录鉴权服务(三):RSA(RS512) 签名 JWT

客户端强类型约束,自动生成 API TS 类型定义

protobufjsprotobufjs 安装:

官方文档:protobufjs

安装:

代码语言:javascript
复制
yarn add protobufjs

node_modules/.bin 会多出如下命令:

  • pbjs
  • pbts

根据 auth.proto 生成 API TS 类型定义

代码语言:javascript
复制
PROTO_PATH=../microsvcs/auth/api
PBTS_BIN_DIR=./node_modules/.bin
PBTS_OUT_DIR=./miniprogram/service/proto_gen/auth
mkdir -p $PBTS_OUT_DIR

$PBTS_BIN_DIR/pbjs -t static -w es6 $PROTO_PATH/auth.proto --no-create --no-encode --no-decode --no-verify --no-delimited -o $PBTS_OUT_DIR/auth_pb_tmp.js
echo 'import * as $protobuf from "protobufjs";\n' > $PBTS_OUT_DIR/auth_pb.js
cat $PBTS_OUT_DIR/auth_pb_tmp.js >> $PBTS_OUT_DIR/auth_pb.js
rm $PBTS_OUT_DIR/auth_pb_tmp.js
$PBTS_BIN_DIR/pbts -o $PBTS_OUT_DIR/auth_pb.d.ts $PBTS_OUT_DIR/auth_pb.js

脚本已被放置在 miniprogram/gen_ts.sh,在 miniprogram 目录执行 sh gen_ts.sh 即可生成如下文件:

  • miniprogram/miniprogram/service/proto_gen/auth/auth_pb.js
  • miniprogram/miniprogram/service/proto_gen/auth/auth_pb.d.ts

修改 app.ts

引入:

代码语言:javascript
复制
import { auth } from "./service/proto_gen/auth/auth_pb"

在文件里面做如下改动:

从上图可以看到有属性提示。这里我们也加入了一个 camelcase-keys 包。它主要用来将属性 key 从网络上传输的 expires_in 转换为 expiresIn

Token 验证

编码实战

具体代码位于:microsvcs/shared/auth/token/token.go

代码语言:javascript
复制
type JWTTokenVerifier struct {
	PublicKey *rsa.PublicKey
}
func (v *JWTTokenVerifier) Verify(token string) (string, error) {
	t, err := jwt.ParseWithClaims(token, &jwt.StandardClaims{}, func(t *jwt.Token) (interface{}, error) {
		return v.PublicKey, nil
	})
	if err != nil {
		return "", fmt.Errorf("cannot parse token: %v", err)
	}
	if !t.Valid {
		return "", fmt.Errorf("token not valid")
	}
	clm, ok := t.Claims.(*jwt.StandardClaims)
	if !ok {
		return "", fmt.Errorf("token claim is not StandardClaims")
	}
	if err := clm.Valid(); err != nil {
		return "", fmt.Errorf("claim not valid: %v", err)
	}
	return clm.Subject, nil
}

测试用例

  • 正常
  • token 过期
  • 坏的 token
  • 签名错误

具体代码位于:microsvcs/shared/auth/token/token_test.go

Refs

  • Demo: go-grpc-gateway-v2-microservice
    • https://github.com/Hacker-Linner/go-grpc-gateway-v2-microservice
  • gRPC-Gateway
    • https://github.com/grpc-ecosystem/grpc-gateway
  • gRPC-Gateway Docs
    • https://grpc-ecosystem.github.io/grpc-gateway
  • API Security : API key is dead..Long live Distributed Token by value
    • https://www.linkedin.com/pulse/api-security-key-deadlong-live-distributed-token-value-joseph-george
代码语言:javascript
复制
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2021-04-15,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 黑客下午茶 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 系列
  • 客户端强类型约束,自动生成 API TS 类型定义
    • protobufjsprotobufjs 安装:
      • 根据 auth.proto 生成 API TS 类型定义
        • 修改 app.ts
        • Token 验证
          • 编码实战
            • 测试用例
            • Refs
            相关产品与服务
            云开发 CloudBase
            云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为200万+企业和开发者提供高可用、自动弹性扩缩的后端云服务,可用于云端一体化开发多种端应用(小程序、公众号、Web 应用等),避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档