天天看點

Go+gRPC-Gateway(V2) 微服務實戰,小程式登入鑒權服務(四):用戶端強類型限制,自動生成 API TS 類型定義

Go+gRPC-Gateway(V2) 微服務實戰,小程式登入鑒權服務(四):用戶端強類型限制,自動生成 API TS 類型定義

系列

  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 類型定義

protobufjs

官方文檔:protobufjs

安裝:

yarn add protobufjs
           

node_modules/.bin

會多出如下指令:

  • pbjs

  • pbts

根據

auth.proto

生成 API TS 類型定義

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

引入:

import { auth } from "./service/proto_gen/auth/auth_pb"
           

在檔案裡面做如下改動:

Go+gRPC-Gateway(V2) 微服務實戰,小程式登入鑒權服務(四):用戶端強類型限制,自動生成 API TS 類型定義

從上圖可以看到有屬性提示。這裡我們也加入了一個

camelcase-keys

包。它主要用來将屬性

key

從網絡上傳輸的

expires_in

轉換為

expiresIn

Token 驗證

編碼實戰

具體代碼位于:

microsvcs/shared/auth/token/token.go

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

  • API Security : API key is dead..Long live Distributed Token by value
  • Demo: go-grpc-gateway-v2-microservice
  • gRPC-Gateway
  • gRPC-Gateway Docs
我是為少
微信:uuhells123
公衆号:黑客下午茶
加我微信(互相學習交流),關注公衆号(擷取更多學習資料~)