'Linux後臺開發-App Sign(簽名)認證-token簽名認證'

Linux Go語言 鏡音雙子 Linux後臺開發 2019-09-06
"
"
Linux後臺開發-App Sign(簽名)認證-token簽名認證

最近在搞音視頻聊天的項目,為了保證服務器的安全以及在以後授權給第三方使用時避免被其他人盜用AppID進行項目開發。

主要流程:

(1)業務服務器根據appid,app sign以及其他字段生成token,例如,go 語言 login_token 生成示例代碼如下

func makeTokenSample(appid uint32, app_sign string, idname string, expired_add int64) (ret string, err error){
nonce := UniqueId()
expired := time.Now().Unix() + expired_add //單位:秒
app_sign = strings.Replace(app_sign, "0x","",-1)
app_sign = strings.Replace(app_sign, ",", "", -1)
if len(app_sign) < 32 {
return "", fmt.Errorf("app_key wrong")
}
app_sign_32 := app_sign[0:32]
source := fmt.Sprintf("%d%s%s%s%d",appid,app_sign_32,idname,nonce,expired)
sum := GetMd5String(source)
token := tokenInfo{}
token.Ver = 1
token.Hash = sum
token.Nonce = nonce
token.Expired = expired
buf, err := json.Marshal(token)
if err != nil {
return "", err
}
encodeString := base64.StdEncoding.EncodeToString(buf)
return encodeString, nil
}

(2)客戶端去服務器端請求到token

(3)然後使用該token去主服務器進行登錄認證,在登錄的時候記得附帶token和appid;

(4)主服務器根據appid查詢到相應的App sign,並且解碼base64.URLEncoding.DecodeString(token),得到nonce和expired的元素,比如

{"ver":1,"hash":"f925e8b0e70d7d7b3006e5226d471e02","nonce":"3576fa6e5000003","expired":1553247969}

hash部分就是我們要匹對的字符串,在主服務器端根據appid,app sign,nonce和expired重新生成Hash2

app_sign_32 := app_sign[0:32]
source := fmt.Sprintf("%d%s%s%s%d",appid,app_sign_32,idname,nonce,expired)
hash2:= GetMd5String(source)

匹對hash2和hash則成功則簽名認證成功,特別要注意的是app sign一定不要洩露給別人,只要第三方拿到你的簽名,那也是一樣可以生成鑑權通過的token

鑑權成功後,expired用確定token的過期時間,如果過期則需要使用新的token進行驗證。

"

相關推薦

推薦中...