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); }