模塊列表
系統使用 token 機制識別授權用戶,通常在用戶登入後會返回一個 token
message Token {
// 訪問 token
string access = 1;
// 刷新 token
string refresh = 2;
// 訪問 token 過期時間 unix
int64 accessDeadline = 3;
// 刷新 token 過期時間 unix
int64 refreshDeadline = 4;
}
在請求服務器接口時客戶端需要將 Token.access 傳輸給服務器,客戶端自由選擇多種傳輸方式
curl -H "Authorization: Bearer XXXXX"
curl /api/xxx?access_token=Bearer%20XXXXX
通常爲了安全性 Token.access 都被設置爲 1 小時過期,而 Token.refresh 設置爲 24 小時過期,當 Token.access 過期後客戶端應該使用 Token.refresh 刷新 token
客戶端應該在請求服務器後判斷 http 相應碼是否爲 Unauthorized(401) 或者也可以判斷 grpc 響應代碼是否爲 Unauthenticated(16) 如果是的化,很可能是 Token.access 已經過期,此時客戶端應該自動刷新 token 後重試請求,以讓此過程對用戶來說是透明不存在的。
只有授權用戶才能執行相應的操作,授權用戶可以通過此模塊,創建授權的會話。
函數列表
Sigin 用於用戶登入如果成功則會返回一個 Token 作爲用戶憑證
rpc Sigin (SiginRequest) returns (SiginResponse){
option (google.api.http) = {
post: "/api/v1/session"
body: "*"
};
}
http 路徑:
/api/v1/session
Captcha 和 Sigin 接口類似用於用戶登入,但唯一的區別是 Captcha 接口需要傳入一個驗證碼以過濾機器人登入。你可以使用 Generate 接口或 Math 接口來創建驗證碼。
注意驗證碼在登入一次後(即Captcha被調用),無論登入是否成功都會失效(即後端會使用 clear:true 調用 Verify 接口)。
rpc Captcha (CaptchaRequest) returns (SiginResponse){
option (google.api.http) = {
post: "/api/v1/session/captcha"
body: "*"
};
}
http 路徑:
/api/v1/session/captcha
SiginRequest 是登入參數,其內容比較多下面將一一解釋
message SiginRequest{
// 登入平臺,每種平臺 同時只能有一個 合法的 session,後續登入將使更早登入的 session 失效,推薦值如下
// * web
// * ios
// * android
// * fuchsia
// * chrome os
// * windows
// * linux
// * mac
// * microapp of wechat -> 微信小程式
// * microapp of bytedance -> 抖音小程式
// * microapp of baidu -> 百度小程式
// 不同的客戶端應該使用合適的值,以使服務器可以正確跟蹤 客戶端版本信息
string platform = 1;
// 登入用的 用戶名稱 或者 綁定電話
string name = 2;
// 密碼使用的加密方式
// * none
// * md5
// * sha1
// * sha224
// * sha256
// * sha384
// * sha512
// none 方式僅用於方便測試請勿在生產中使用
string encrypt = 3;
// 執行請求時的時間 unix 誤差浮動不能超過 5 分鐘
int64 at = 4;
// 登入密碼
// var password=input_password
// if encrypt != none {
// var at = at.toString()
// password = md5(password+".kb2022").lowerHex()
// password = encrypt(at+password).lowerHex()
// }
string password = 5;
// 是否要返回 SiginResponse.data
bool data = 6;
// 是否將返回的令牌設置到 cookie 僅用於測試時使用
bool cookie = 7;
}
platform 指示了客戶端平臺,一個平臺同時只能有一個合法 session,最後創建的 session 將會覆蓋前述創建的 session。客戶端應該依據自己的平臺填寫服務器預定義的對應值
name 指示了哪個用戶要執行登入,可以是註冊時的用戶名或者用戶綁定的手機號碼
encrypt 密碼加密方式,依據此值的不同,需要對用戶輸入的密碼執行不同的加密操作後傳輸以防止密碼被網路竊取或重放攻擊
at 客戶端傳入當前時間的 unix 值,用於爲密碼加鹽以及防止重放攻擊。如果 encrypt 設置爲 none 則可以忽略此參數
password 密碼,如果 encrypt 設置爲 none 則設置爲用戶輸入的密碼(強烈建議不要這麼做,這會明文傳輸且容易受到重放攻擊)。如果 encrypt 不爲 none 則進行如下加密
var password=input_password
if encrypt != none {
var at = at.toString()
password = md5(password+".kb2022").lowerHex()
password = encrypt(at+password).lowerHex()
}
SiginRequest.password=password
data 如果設置爲 true ,在登入成功時除了返回token外,服務器還會返回 token 關聯的 session 信息
cookie 如果設置爲 true,服務器會爲 http 請求返回 set-cookie 請求以將 訪問token 設置到 cookie 中。通常這僅僅是爲了測試的方便,請勿在生產中使用。
你可以通常在線工具測試登入接口
Signout 用於登出,它將在服務器上銷毀登入用戶的 Token 憑證
rpc Signout (SignoutRequest) returns (SignoutResponse){
option (google.api.http) = {
delete: "/api/v1/session"
};
}
http 路徑:
/api/v1/session
權限要求: session
Get 可以返回登入用戶關聯的 session 信息
rpc Get (GetRequest) returns (GetResponse){
option (google.api.http) = {
get: "/api/v1/session"
};
}
http 路徑:
/api/v1/session
GetByAccess 用於返回與指定 Token.access 關聯的 session 信息
rpc GetByAccess (GetByAccessRequest) returns (GetResponse){
option (google.api.http) = {
get: "/api/v1/session/{access}"
};
}
http 路徑:
/api/v1/session/{access}
但訪問 token 過期但刷新 token 依然有效時,可以通過調用此接口 獲取到新的 token
rpc Refresh (RefreshRequest) returns (RefreshResponse){
option (google.api.http) = {
post: "/api/v1/session/refresh"
body: "*"
};
}
http 路徑:
/api/v1/session/refresh
Chains 只有 root 可以調用,用於創建一個調用內部系統的訪問令牌
rpc Chains (ChainsRequest) returns (ChainsResponse){
option (google.api.http) = {
post: "/api/v1/session/chains"
body: "*"
};
}
http 路徑:
/api/v1/session/chains
權限要求: root(1)