最近在搞音視頻聊天的項目,為了保證服務器的安全以及在以后授權給第三方使用時避免被其他人盜用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進行驗證。