前面谈过gRPC的SSL/TLS安全机制,发现设置过程比较复杂:比如证书签名:需要服务端、客户端两头都设置等。想想实际上用JWT会更加便捷,而且更安全和功能强大,因为除JWT的加密签名之外还可以把私密的用户信息放在JWT里加密后在服务端和客户端之间传递。当然,最基本的是通过对JWT的验证机制可以控制客户端对某些功能的使用权限。
通过JWT实现gRPC的函数调用权限管理原理其实很简单:客户端首先从服务端通过身份验证获取JWT,然后在调用服务函数时把这个JWT同时传给服务端进行权限验证。客户端提交身份验证请求返回JWT可以用一个独立的服务函数实现,如下面.proto文件里的GetAuthToken:
message PBPOSCredential { string userid = 1; string password = 2; } message PBPOSToken { string jwt = 1; } service SendCommand { rpc SingleResponse(PBPOSCommand) returns (PBPOSResponse) {}; rpc GetTxnItems(PBPOSCommand) returns (stream PBTxnItem) {}; rpc GetAuthToken(PBPOSCredential) returns (PBPOSToken) {}; }