第三方登陸 - 移動端與服務端解決方案

移動端(android)

1.在友盟對各平臺封裝的基礎上再次封裝,直接一個回調拿到第三方平臺token,openid,unionid,nickname等信息.
這一個方法中包含了用戶點擊受權拿token,根據token拿我的信息兩個步驟.javascript

庫地址參見:UmengUtilhtml

//其餘平臺如loginByWeixin(this, new AuthCallback<WeixinInfo>()
UmengUtil.loginBySina(this, new AuthCallback<SinaInfo>() {
                    @Override
                    public void onComplete(int var2, SinaInfo info) {
                        Log.e("dd",info.toString());

                    }

                    @Override
                    public void onError( int var2, Throwable var3) {

                    }

                    @Override
                    public void onCancel( int var2) {

                    }
                });複製代碼

2.而後,把必要的信息發送到服務端java

服務端

拿到token,openid等關鍵信息,調用各平臺的api進行信息覈對校驗,
若是經過,執行下一步:
根據第三方的openid/unionid去咱們的數據庫查閱,
若是沒有帳戶,則生成新的帳戶.若是有帳戶,就不用生成.
最後,將帳戶我的信息取出,返回給客戶端.
這樣,就完成了登陸操做.android

信息校驗的api:

校驗的規則通常都是: 根據客戶端傳來的token去各平臺拿openid,而後與客戶端傳來的openid比對,若是一致,就表明客戶端數據沒問題,校驗無誤.git

sina

OAuth2/get_token_info
查詢用戶access_token的受權相關信息,包括受權時間,過時時間和scope權限。github

URL:api.weibo.com/oauth2/get_…
HTTP請求方式:POST
請求參數
access_token:用戶受權時生成的access_token。
返回數據
{ "uid": 1073880650, "appkey": 1352222456, "scope": null, "create_at": 1352267591, "expire_in": 157679471 }算法

微信

獲取用戶基本信息(包括UnionID機制)數據庫

注: 在微信帳戶體系中,unionid纔是一個微信帳戶的惟一標識(而openid是跟公衆號,服務號等發生關聯產生的),因此微信的校驗是經過token和openid來獲取unionid,而後與客戶端傳來的unionid進行比對校驗.json

http請求方式: GET
api.weixin.qq.com/cgi-bin/use…api

返回說明
正常狀況下,微信會返回下述JSON數據包給公衆號:

{ "subscribe": 1, 
"openid": "o6_bmjrPTlm6_2sgVt7hMZOPfL2M", 
"nickname": "Band",
 "sex": 1, 
"language": "zh_CN",
 "city": "廣州", 
"province": "廣東", 
"country": "中國",
 "headimgurl": "[http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0](http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0)", 
"subscribe_time": 1382694957, 
"unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL",
 "remark": "",
 "groupid": 0}複製代碼

QQ

獲取用戶OpenID_OAuth2.0

1 請求地址
PC網站:graph.qq.com/oauth2.0/me
WAP網站:graph.z.qq.com/moc2/me
2 請求方法:GET
3 請求參數:access_token
4 返回說明
PC網站接入時,獲取到用戶OpenID,返回包以下:
callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} );

注意解析openid時要將外層括號去掉才能拿到json.

永久登陸的實現

問題

看起來像掉線

第三方受權和獲取信息時,友盟工具會將相關信息在本地保存一份,以實現下次不用再吊起受權界面讓用戶再次點擊.
可是,第三方token都是有過時時間的.超過了這個時間,受權界面是會被吊起的,這給用戶看起來就好像莫名其妙掉線了,體驗很是很差,那麼,要怎麼實現移動端第三方登陸的永久登陸呢?

一個解決方式

將第三方登陸轉變成帳號密碼登陸:

在這臺手機上第一次用第三方登陸時,固然是吊起受權界面.
當服務端斷定登陸成功時,返回第三方帳戶體系的用戶id(openid/unionid)或者內部帳戶體系的uid,和服務端生成的一個密碼(UUID等算法ramdom出來,反正不用用戶記)
客戶端拿到這兩個數據,加密後保存到本地,下次進入app時,直接用這兩個來登陸.

更進一步

token

爲了不每次都傳輸用戶名密碼(即便加了密,在網絡暴露太多也很差),能夠在登陸成功後,服務端生成一個token和規定其有效期(設置長一點,十幾天一個月之類的),並下發,
每次客戶端拿本地token,判斷有效期,在有效期內用token登陸或者做爲登陸驗證,過時就用用戶名密碼登陸.

短時頻繁登陸,以及多臺設備搶登的處理

session處理

驗證用戶名密碼或者token經過後,若是同一個user的原session還存在:

先判斷是否爲同一個ip,若是不是,kill原session,建立新的session.
若是是原ip,就沒必要建立新的session.

多臺設備搶登問題

兩臺手機相隔很短的事件前後登陸同一個帳戶,若是移動端實現了對用戶徹底透明的過時重登機制,那麼仍是會出現看起來兩臺手機同時登陸同一個帳戶,而對於服務端來講,就是不斷地在建立session,銷燬session.
怎麼處理呢?

服務端的響應多增長一個錯誤碼類別:
原先的:登陸token過時一個code
增長的: 其餘設備登陸的一個code

客戶端拿到第二個code時,能夠再也不作自動從新登陸,而是像QQ同樣彈出notification通知用戶,讓用戶主動選擇.

相關文章
相關標籤/搜索