系列
- 雲原生 API 閘道器,gRPC-Gateway V2 初探
- Go + gRPC-Gateway(V2) 構建微服務實戰系列,小程式登入鑑權服務:第一篇
- Go + gRPC-Gateway(V2) 構建微服務實戰系列,小程式登入鑑權服務:第二篇
- 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"
在檔案裡面做如下改動:
從上圖可以看到有屬性提示。這裡我們也加入了一個 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
公眾號:黑客下午茶
加我微信(互相學習交流),關注公眾號(獲取更多學習資料~)