最近在搞音視頻聊天的項(xiàng)目,為了保證服務(wù)器的安全以及在以后授權(quán)給第三方使用時(shí)避免被其他人盜用AppID進(jìn)行項(xiàng)目開發(fā)。
主要流程:
(1)業(yè)務(wù)服務(wù)器根據(jù)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)客戶端去服務(wù)器端請(qǐng)求到token
(3)然后使用該token去主服務(wù)器進(jìn)行登錄認(rèn)證,在登錄的時(shí)候記得附帶token和appid;
(4)主服務(wù)器根據(jù)appid查詢到相應(yīng)的App sign,并且解碼
base64.URLEncoding.DecodeString(token),得到nonce和expired的元素,比如
{"ver":1,"hash":"f925e8b0e70d7d7b3006e5226d471e02","nonce":"3576fa6e5000003","expired":1553247969}
hash部分就是我們要匹對(duì)的字符串,在主服務(wù)器端根據(jù)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)
匹對(duì)hash2和hash則成功則簽名認(rèn)證成功,特別要注意的是app sign一定不要泄露給別人,只要第三方拿到你的簽名,那也是一樣可以生成鑒權(quán)通過的token。
鑒權(quán)成功后,expired用確定token的過期時(shí)間,如果過期則需要使用新的token進(jìn)行驗(yàn)證。