guard/generate/protobuf/permission.proto

235 lines
6.4 KiB
Protocol Buffer
Raw Normal View History

2024-08-05 08:56:19 +00:00
syntax = "proto3";
package permission;
option go_package="./permission";
// OKResp
message OKResp {}
// NoneReq
message NoneReq {}
2024-08-05 08:56:19 +00:00
// 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;
2024-08-05 08:56:19 +00:00
}
// 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;
2024-08-05 08:56:19 +00:00
}
message Tokens{
repeated TokenResp token = 1;
}
message CancelOneTimeTokenReq {
2024-08-05 08:56:19 +00:00
repeated string token = 1;
}
// 跟 Token 相關的大小事,這次只回應錯誤,以及結果,不統一規範
// 錯誤碼應該在 Biz GW 在做回應,另外我這邊取名字比較通用,
// access_token -> token , refresh_token -> one_time_token
service TokenService {
2024-08-05 08:56:19 +00:00
// 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);
2024-08-05 08:56:19 +00:00
// NewOneTimeToken 建立一次性使用例如RefreshToken
rpc NewOneTimeToken(CreateOneTimeTokenReq) returns(CreateOneTimeTokenResp);
// CancelOneTimeToken 取消一次性使用
rpc CancelOneTimeToken(CancelOneTimeTokenReq) returns(OKResp);
2024-08-05 08:56:19 +00:00
}
// --------------------------------------------------------------------------------
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);
}
service RoleService {
rpc Ping(OKResp) returns(OKResp);
}