commit 0dc3881f7c9cd475ab353784b35eb9d009e8ac11 Author: daniel.w Date: Mon Aug 5 16:56:19 2024 +0800 init project diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d7d485f --- /dev/null +++ b/.gitignore @@ -0,0 +1,5 @@ +.idea/ +go.sum +account/ +gen_result/ +etc/permission.yaml \ No newline at end of file diff --git a/generate/database/mysql/create/20230529020000_create_schema.down.sql b/generate/database/mysql/create/20230529020000_create_schema.down.sql new file mode 100644 index 0000000..e7727a5 --- /dev/null +++ b/generate/database/mysql/create/20230529020000_create_schema.down.sql @@ -0,0 +1 @@ +DROP DATABASE IF EXISTS `ark_member`; \ No newline at end of file diff --git a/generate/database/mysql/create/20230529020000_create_schema.up.sql b/generate/database/mysql/create/20230529020000_create_schema.up.sql new file mode 100644 index 0000000..d997e04 --- /dev/null +++ b/generate/database/mysql/create/20230529020000_create_schema.up.sql @@ -0,0 +1 @@ +CREATE DATABASE IF NOT EXISTS `ark_member`; \ No newline at end of file diff --git a/generate/protobuf/permission.proto b/generate/protobuf/permission.proto new file mode 100644 index 0000000..6993cc4 --- /dev/null +++ b/generate/protobuf/permission.proto @@ -0,0 +1,147 @@ +syntax = "proto3"; + +package permission; + +option go_package="./permission"; + +// OKResp +message OKResp {} + +// 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 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 { + repeated string device_id = 1; +} + +message Tokens{ + repeated string token = 1; +} + +// 跟 Token 相關的大小事,這次只回應錯誤,以及結果,不統一規範 +// 錯誤碼應該在 Biz GW 在做回應,另外我這邊取名字比較通用, +// access_token -> token , refresh_token -> one_time_token +service Token_Service { + // 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); + // CancelTokenByUID 取消 Token (取消這個用戶從不同 Device 登入的所有 Token),也包含他裡面的 One Time Toke + rpc CancelTokenByUID(DoTokenByUIDReq) returns(OKResp); + // CancelTokenByDeviceID 取消 Token + rpc CancelTokenByDeviceID(DoTokenByDeviceIDReq) returns(OKResp); + // ValidationToken 驗證這個 Token 有沒有效 + rpc ValidationToken(ValidationTokenReq) returns(ValidationTokenResp); + // GetUserTokensByDeviceIDs 取得目前所對應的 DeviceID 所存在的 Tokens + rpc GetUserTokensByDeviceID(DoTokenByDeviceIDReq) returns(Tokens); + // GetUserTokensByUID 取得目前所對應的 UID 所存在的 Tokens + rpc GetUserTokensByUID(DoTokenByUIDReq) returns(Tokens); + // NewOneTimeToken 建立一次性使用,例如:RefreshToken + rpc NewOneTimeToken(CreateOneTimeTokenReq) returns(CreateOneTimeTokenResp); + // CancelOneTimeToken 取消一次性使用 + rpc CancelOneTimeToken(CreateOneTimeTokenReq) returns(CreateOneTimeTokenResp); +} + + +//service Role_Service {} +// +//service Permission_Service {} \ No newline at end of file