標籤:
最近要用到一個叫融雲的及時通訊的SDK,在擷取token這個步驟的時候有點卡頓,以防以後碰到類似的問題,再此記錄一下。
用戶端通過融雲 SDK 每次串連伺服器時,都需要向伺服器提供 Token,以便驗證身份,流程如下:
流程如下:
1、用戶端擷取使用者id,並向伺服器請求token(注意這裡的伺服器不是融雲的伺服器,而是用戶端的服務端)
2、用戶端的服務端接收到token請求後,向融雲的伺服器請求token
3、融雲端服務器接受到token請求,返回token給用戶端的服務端。
4、用戶端的服務端接收到token以後,儲存在資料庫。
5、服務端返回token給用戶端。用戶端每次請求token時,先檢查資料庫中是否存在有效token。
6、用戶端附帶token串連到聊天伺服器
官方給的樣本如下:
http請求:
POST /user/getToken.json HTTP/1.1Host: api.cn.ronghub.comApp-Key: uwd1c0sxdlx2Nonce: 14314Timestamp: 1408706337Signature: 45beb7cc7307889a8e711219a47b7cf6a5b000e8Content-Type: application/x-www-form-urlencodeduserId=jlk456j5&name=Ironman&portraitUri=http%3A%2F%2Fabc.com%2Fmyportrait.jpg
http響應:
HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8{"code":200, "userId":"jlk456j5", "token":"sfd9823ihufi"}
一開始我並不理解擷取token的流程,然後在瀏覽器頁面發送向融雲發送post請求,結果一直報錯,大致是跨域問題(因為涉及到要向api.cn.ronghub.com主機地址發送post請求),整了一整天還是沒解決,然後就考慮在nodejs伺服器來發送post請求。
代碼如下:
var regUrl = "http://api.cn.ronghub.com/user/getToken.json"; var post_option = url.parse(regUrl); post_option.method = ‘POST‘; var post_data = querystring.stringify({ ‘userId‘ : "*******", //你的 ‘name‘ : "*******", //你的 ‘portraitUri‘ : "http://tva1.sinaimg.cn/crop.0.0.100.100.180/7e07eb40jw8f6hqda28x7j202t02tmx1.jpg" }); console.log(post_data); post_option.headers = { ‘Content-Type‘ : ‘application/x-www-form-urlencoded‘, ‘Content-Length‘ : post_data.length, ‘App-Key‘:"**********", //你的 ‘appSecret‘:‘********‘, //你的 ‘Nonce‘:‘14314‘, ‘timestamp‘:‘1408706337‘, ‘Signature‘:‘**************‘ //你的 }; var post_req = http.request(post_option, function(response){ response.on(‘data‘, function(buffer){ console.log(buffer.toString()); }); }); post_req.write(post_data); post_req.end();
上面代碼有些參數沒有給出需要你自己填寫,Signature是經過sha1換算以後得來的值,是不會變的,大家可以根據自己的情況修改
Signature值的擷取如下:
var appSecret = ‘******‘; // 開發人員平台分配的 App Secret。var nonce = "14314"; // 擷取隨機數。var timestamp = "1408706337"; // 擷取時間戳記。var str = [appSecret,nonce,timestamp].sort().join(‘‘);var signature = sha1(str);
上面的代碼擷取token以後直接顯示在瀏覽器上,並沒有存入資料庫,大家可以自己修改。
總結:
如果採用瀏覽器來發送post請求,會存在跨域的問題,這時候就可以使用伺服器來發送,瀏覽器請求伺服器,伺服器再體瀏覽器向遠程伺服器發送post請求,就完美避開了瀏覽器跨域的問題。
nodejs向遠程伺服器發送post請求----融雲Web SDK/用戶端擷取token