326 lines
8.8 KiB
Protocol Buffer
326 lines
8.8 KiB
Protocol Buffer
syntax = "proto3";
|
||
|
||
package permission;
|
||
|
||
option go_package="./permission";
|
||
|
||
// OKResp
|
||
message OKResp {}
|
||
// NoneReq
|
||
message NoneReq {}
|
||
|
||
// AuthorizationReq 定義授權請求的結構
|
||
message AuthorizationReq {
|
||
// grant_type 表示授權類型
|
||
string grant_type = 1;
|
||
// device_id 表示設備 ID
|
||
string device_id = 2;
|
||
// scope 表示授權範圍
|
||
string scope = 3;
|
||
// data 是一個通用的 key-value 結構,用於存儲額外數據
|
||
map<string,string> data = 4;
|
||
// expires 表示過期時間
|
||
int32 expires = 5;
|
||
// is_refresh_token 表示是否為刷新令牌
|
||
bool is_refresh_token = 6;
|
||
}
|
||
|
||
// TokenResp 定義訪問令牌響應的結構
|
||
message TokenResp {
|
||
// access_token 表示訪問令牌
|
||
string access_token = 1;
|
||
// token_type 表示令牌類型
|
||
string token_type = 2;
|
||
// expires_in 表示令牌過期時間
|
||
int32 expires_in = 3;
|
||
// refresh_token 表示刷新令牌
|
||
string refresh_token = 4;
|
||
}
|
||
|
||
// CreateOneTimeTokenReq 建立一次性使用的 token,
|
||
// 要帶比較長久的 token 來,驗證後才可以
|
||
message CreateOneTimeTokenReq {
|
||
string token = 1;
|
||
}
|
||
|
||
message CreateOneTimeTokenResp {
|
||
string one_time_token = 1;
|
||
}
|
||
|
||
// RefreshTokenReq 更新 Token
|
||
message RefreshTokenReq {
|
||
string token = 1;
|
||
string scope = 2;
|
||
int64 expires = 3;
|
||
string device_id = 4;
|
||
}
|
||
|
||
// https://datatracker.ietf.org/doc/html/rfc6749#section-4.3.3
|
||
message RefreshTokenResp {
|
||
string token =1;
|
||
string one_time_token = 2;
|
||
int64 expires_in = 3;
|
||
string token_type = 4;
|
||
}
|
||
|
||
// CancelTokenReq 註銷這個 Token
|
||
message CancelTokenReq {
|
||
string token = 1;
|
||
}
|
||
|
||
// CancelTokenReq 註銷這個 Token
|
||
message DoTokenByUIDReq {
|
||
repeated string ids = 1;
|
||
string uid = 2;
|
||
}
|
||
|
||
// QueryTokenByUIDReq 拿這個UID 找 Token
|
||
message QueryTokenByUIDReq {
|
||
string uid = 1;
|
||
}
|
||
|
||
// ValidationTokenReq 驗證這個 Token
|
||
message ValidationTokenReq {
|
||
string token = 1;
|
||
}
|
||
|
||
// ValidationTokenResp 驗證以及取得 Token 詳情
|
||
message ValidationTokenResp {
|
||
Token token = 1;
|
||
map<string,string> data = 2;
|
||
}
|
||
|
||
// Token 定義令牌的結構
|
||
message Token {
|
||
// ID 表示令牌的唯一標識符
|
||
string id = 1;
|
||
// client_id 表示客戶端 ID
|
||
int32 client_id = 2;
|
||
// uid 表示用戶 ID
|
||
string uid = 3;
|
||
// device_id 表示設備 ID
|
||
string device_id = 4;
|
||
// access_token 表示訪問令牌
|
||
string access_token = 5;
|
||
// expires_in 表示訪問令牌的過期時間(秒)
|
||
int32 expires_in = 6;
|
||
// access_create_at 表示訪問令牌的創建時間
|
||
int64 access_create_at = 7;
|
||
// refresh_token 表示刷新令牌
|
||
string refresh_token = 8;
|
||
// refresh_expires_in 表示刷新令牌的過期時間(秒)
|
||
int32 refresh_expires_in = 9;
|
||
// refresh_create_at 表示刷新令牌的創建時間
|
||
int64 refresh_create_at = 10;
|
||
}
|
||
|
||
// DoTokenByDeviceIDReq 用DeviceID 來做事的
|
||
message DoTokenByDeviceIDReq {
|
||
string device_id = 1;
|
||
}
|
||
|
||
message Tokens{
|
||
repeated TokenResp token = 1;
|
||
}
|
||
|
||
message CancelOneTimeTokenReq {
|
||
repeated string token = 1;
|
||
}
|
||
|
||
// 跟 Token 相關的大小事,這次只回應錯誤,以及結果,不統一規範
|
||
// 錯誤碼應該在 Biz GW 在做回應,另外我這邊取名字比較通用,
|
||
// access_token -> token , refresh_token -> one_time_token
|
||
service TokenService {
|
||
// NewToken 建立一個新的 Token,例如:AccessToken
|
||
rpc NewToken(AuthorizationReq) returns(TokenResp);
|
||
// RefreshToken 更新目前的token 以及裡面包含的一次性 Token
|
||
rpc RefreshToken(RefreshTokenReq) returns(RefreshTokenResp);
|
||
// CancelToken 取消 Token,也包含他裡面的 One Time Toke
|
||
rpc CancelToken(CancelTokenReq) returns(OKResp);
|
||
// ValidationToken 驗證這個 Token 有沒有效
|
||
rpc ValidationToken(ValidationTokenReq) returns(ValidationTokenResp);
|
||
// CancelTokens 取消 Token 從UID 視角,以及 token id 視角出發, UID 登出,底下所有 Device ID 也要登出, Token ID 登出, 所有 UID + Device 都要登出
|
||
rpc CancelTokens(DoTokenByUIDReq) returns(OKResp);
|
||
|
||
// CancelTokenByDeviceId 取消 Token, 從 Device 視角出發,可以選,登出這個Device 下所有 token ,登出這個Device 下指定token
|
||
rpc CancelTokenByDeviceId(DoTokenByDeviceIDReq) returns(OKResp);
|
||
// GetUserTokensByDeviceId 取得目前所對應的 DeviceID 所存在的 Tokens
|
||
rpc GetUserTokensByDeviceId(DoTokenByDeviceIDReq) returns(Tokens);
|
||
|
||
|
||
// GetUserTokensByUid 取得目前所對應的 UID 所存在的 Tokens
|
||
rpc GetUserTokensByUid(QueryTokenByUIDReq) returns(Tokens);
|
||
|
||
// NewOneTimeToken 建立一次性使用,例如:RefreshToken
|
||
rpc NewOneTimeToken(CreateOneTimeTokenReq) returns(CreateOneTimeTokenResp);
|
||
// CancelOneTimeToken 取消一次性使用
|
||
rpc CancelOneTimeToken(CancelOneTimeTokenReq) returns(OKResp);
|
||
}
|
||
|
||
|
||
// --------------------------------------------------------------------------------
|
||
enum PermissionStatus {
|
||
PERMISSION_STATUS_NONE = 0; // 初始(異常)
|
||
PERMISSION_STATUS_OPEN = 1;
|
||
PERMISSION_STATUS_CLOSE = 2;
|
||
}
|
||
|
||
|
||
message PermissionStatusItem {
|
||
int64 id =1;
|
||
int64 parent_id =2;
|
||
string name =3;
|
||
PermissionStatus status = 4;
|
||
string type =5;
|
||
bool approval = 6;
|
||
}
|
||
|
||
message ListPermissionStatusResp {
|
||
repeated PermissionStatusItem data = 1;
|
||
}
|
||
|
||
|
||
message PermissionItem{
|
||
int64 id = 1;
|
||
string name = 2;
|
||
string http_method = 3;
|
||
string http_path = 4;
|
||
optional PermissionItem parent= 5;
|
||
repeated PermissionItem children =6;
|
||
repeated int64 path_ids=7;
|
||
}
|
||
|
||
message ListPermissionResp {
|
||
repeated PermissionItem data = 1;
|
||
}
|
||
|
||
message CheckPermissionByRoleReq {
|
||
string role = 1;
|
||
string path = 2;
|
||
string method = 3;
|
||
}
|
||
|
||
message PermissionResp {
|
||
bool allow = 1;
|
||
string permission_name =2;
|
||
bool plain_code =3;
|
||
}
|
||
|
||
message GetPermissionStatusByPathReq {
|
||
string path = 2;
|
||
string method = 3;
|
||
}
|
||
|
||
message MapPermissionStatusResp {
|
||
map<int64,PermissionStatus> data = 1; // permission id : open close
|
||
}
|
||
|
||
service PermissionService {
|
||
// ListPermissionStatus 取得所有權限狀態列表,給前端表演用
|
||
rpc ListPermissionStatus(NoneReq)returns(ListPermissionStatusResp);
|
||
// ListPermission 一次性取得所有權限表
|
||
rpc ListPermission(NoneReq)returns(MapPermissionStatusResp);
|
||
// CheckPermissionByRole 透過角色 ID 來檢視權限,後台要通過時真的看這個
|
||
rpc CheckPermissionByRole(CheckPermissionByRoleReq)returns(PermissionResp);
|
||
// GetPermissionStatusByPath 透過資源拿取角色的狀態
|
||
rpc GetPermissionStatusByPath(GetPermissionStatusByPathReq)returns(PermissionStatusItem);
|
||
}
|
||
|
||
|
||
// --------------------------------------------------------------------------------
|
||
|
||
message GetRoleReq{
|
||
string role_ids =1;
|
||
string display_name=2;
|
||
repeated string permissions=3;
|
||
PermissionStatus status=4;
|
||
int64 page_index=5;
|
||
int64 page_size=6;
|
||
bool all=7;
|
||
}
|
||
|
||
// RoleResp 對應的 Protobuf message
|
||
message RoleResp {
|
||
int64 id = 1; // ID
|
||
string display_name = 2; // name
|
||
string role_id = 3; // role_id -> 看得懂,自定義的,不會像 int64 這種比較不確定不好操作
|
||
map<string, string> permissions = 4; // permissions
|
||
PermissionStatus status = 5; // status
|
||
int64 create_time = 6; // create_time
|
||
int64 update_time = 7; // update_time
|
||
}
|
||
|
||
// 定義 PageResponse 用來對應 pager.Response
|
||
message PageResponse {
|
||
int64 page_index = 1; // 頁碼
|
||
int64 page_size = 2; // 每頁顯示數量
|
||
int64 total_count = 3; // 總頁數
|
||
}
|
||
|
||
// PageRoleResp 對應的 Protobuf message
|
||
message GetRoleResp {
|
||
repeated RoleResp list = 1; // list
|
||
PageResponse page = 2; // page
|
||
}
|
||
|
||
message CreateRoleReq{
|
||
string display_name=1;
|
||
PermissionStatus status = 2; // status
|
||
string role_id =3;
|
||
}
|
||
|
||
message UpdateRoleReq{
|
||
string role_id =1; // 搜尋條件
|
||
PermissionStatus status = 2; // status
|
||
string display_name =3;
|
||
}
|
||
|
||
// RoleService 建立所有的角色
|
||
service RoleService {
|
||
// CreateRole 建立角色
|
||
rpc CreateRole(CreateRoleReq)returns(RoleResp);
|
||
// GetRole 取得搜尋的角色
|
||
rpc GetRole(GetRoleReq)returns(GetRoleResp);
|
||
// UpdateRole 更新角色
|
||
rpc UpdateRole(UpdateRoleReq)returns(RoleResp);
|
||
}
|
||
|
||
message UserRoleReq{
|
||
string uid =1;
|
||
string role_id =2;
|
||
}
|
||
|
||
message UserRoleResp{
|
||
string uid =1;
|
||
string role_id =2;
|
||
int64 create_time = 3; // create_time
|
||
int64 update_time = 4; // update_time
|
||
}
|
||
|
||
message GetUserRoleResp{
|
||
repeated UpdateRoleReq list=1;
|
||
}
|
||
|
||
message UserPermissionReq{
|
||
string uid =1;
|
||
}
|
||
message UserPermissionResp{
|
||
string role_id =1;
|
||
map<string, string> permissions = 2; // permissions
|
||
}
|
||
|
||
// UserRoleService 綁定角色與權限
|
||
service UserRoleService {
|
||
// CreateUserRole 建立角色
|
||
rpc CreateUserRole(UserRoleReq)returns(UserRoleResp);
|
||
// UpdateRole 更新角色
|
||
rpc UpdateUserRole(UserRoleReq)returns(UserRoleResp);
|
||
// GetUserRole 取得角色綁定表,沒有搜尋條件就全部,不分頁
|
||
rpc GetUserRole(UserRoleReq)returns(GetUserRoleResp);
|
||
// GetUserPermission 取得角色權限
|
||
rpc GetUserPermission(UserPermissionReq)returns(UserPermissionResp);
|
||
}
|
||
|
||
|
||
|