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 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 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 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 permissions = 4; // permissions PermissionStatus status = 5; // status int64 create_time = 6; // create_time int64 update_time = 7; // update_time } // 定義 PageResponse 用來對應 pager.Response message PageResponse { int32 page_index = 1; // 頁碼 int32 page_size = 2; // 每頁顯示數量 int32 total_pages = 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 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); }