第三方登陸簡介:
我的理解第三方登陸就是藉助第三方服務器完成驗證認證過程,即登陸用戶的合法性由第三方來確認,常見的有微博登陸、微信登陸、QQ登陸等。優勢就是不用特地註冊,使用已有的微博帳號等就能夠直接登陸,並且藉助掃碼登陸網頁等相對於輸入用戶名密碼會更加方便快捷,也更加安全,固然若是應用有對應的客戶端的話,也能夠作掃碼登陸,好比支付寶、QQ空間等。缺點的話就是一方面會將一些信息,好比登陸狀況等暴露給第三方,另外一方面會對第三方造成依賴,好比使用QQ登陸的某個網站,可能只記住了QQ,而對該網站毫無印象,即便在第三方登陸後被誘導填寫了註冊信息,也毫無用處,下次依然是須要QQ登陸。本身就有在直播網站使用QQ登陸,而後隨便填寫了註冊信息,自動登陸時間過時後對帳戶密碼徹底沒印象,依然是靠QQ從新登陸。
微博第三方登陸:
微信/QQ第三方登陸須要註冊開發者帳號並認證,一來每一年須要300塊錢,若是不是作盈利產品的話,白白浪費錢,二來認證開發者信息須要公司相關信息,沒看到我的認證途徑。因此就以微博第三方登陸爲例進行了相關學習。微博第三方登陸容許以微博帳號密碼進行登陸,經過OAuth2.0進行受權。OAuth2.0大概流程以下:首先客戶端發起認證請求,用戶贊成進行認證,客戶端到微博服務器上進行認證,微博認證服務器給出AccessToken,客戶端經過該AccessToken換取想要的信息。詳情能夠經過微博開放平臺文檔部分查看。
具體實現:
本身根據須要,有實現了網頁版和Android端,分別使用了提供的PHP SDK和參考了Android SDK。
網站第三方登陸:
首先須要在微博開放平臺(http://open.weibo.com/)註冊開發者帳號,而後在微鏈接選擇網站接入,填寫對應信息,而後能夠在個人應用裏面看到,其中主要用到的有應用基本信息中的App Key和App Secret,高級信息裏面須要填寫受權回調頁,測試信息裏面能夠最多15個測試帳號,測試帳號能夠測試未經過審覈的應用。
作好上面準備工做後網站登陸很是簡單,只須要下載PHP SDK(https://github.com/xiaosier/libweibo),下載後只須要在config.php裏面進行配置,填寫前面獲得的appkey,appsecret以及callback url便可。
而後能夠根據須要進行對應的修改,php
'''
$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );
$code_url = $o->getAuthorizeURL( WB_CALLBACK_URL );
<p><a href="<?=$code_url?>"><img src="weibo_login.png" title="點擊進入受權頁面" alt="點擊進入受權頁面" border="0" /></a></p>html
'''
經過上面三句話提供了微博認證的連接,點擊後就進行了微博認證,不管帳戶密碼登陸仍是掃碼登陸,此時是在微博的server上進行,而後會調到前面指定的回調頁面,能夠在這裏進行一些處理,好比進行判斷是否受權成功,若是失敗了繼續回到前面請求受權,若是受權成功則會拿到AccessToken,使用AccessToken獲取須要的信息。java
'''android
$o = new SaeTOAuthV2( WB_AKEY , WB_SKEY );
$token = $o->getAccessToken( 'code', $keys ) ;
$c = new SaeTClientV2(WB_AKEY , WB_SKEY, $token['access_token']);
$uid_get = $c->get_uid();//獲取u_idgit
'''github
經過上面能夠得到u_id,這個對於微博帳戶來講是惟一的,能夠經過這個值對微博帳戶識別。固然也可跟根據須要獲取其餘想要的信息。web
Android第三方登陸:
相似網站應用,須要填寫應用相關信息,App Key 和App Secret是自動生成的,須要填寫Android包名和包簽名,包名是工程主modules目錄下build.gradle中applicationId值,簽名經過安裝官方提供的工具獲取。詳情可參考sdk中帶有的文檔。在高級信息中回調地址可填寫http://api.weibo.com/oauth2/default.html。完成準備工做後能夠進行編碼。有兩種引入方式,這裏參照說明文檔採用了設置中央倉庫方式,主要改動有:
1,project下的build.gradle 在buildscript repositories下添加 maven { url"https://dl.bintray.com/thelasterstar/maven/"},在allprojects repositories下添加 maven { url"https://dl.bintray.com/thelasterstar/maven/"},在Module:app的build.gradle中的dependencies下添加compile 'com.sina.weibo.sdk:core:2.0.3:openDefaultRelease@aar',而後就可使用相關api了。
好比在demo中建立三個按鈕分別提供web、client、allinone認證方式,web提供網頁認證方式,client會喚起客戶端進行認證,若是客戶端未安裝會給出提示,allinone會嘗試拉起客戶端,若是未安裝則回到網頁方式。
添加三個按鈕
activity_weibo_oauth.xmlapi
'''安全
<Button
android:id="@+id/button_client"
android:layout_width="164dp"
android:layout_height="49dp"
android:layout_marginTop="36dp"
android:text="@string/button_client"
android:onClick="onClickClint"
app:layout_constraintTop_toBottomOf="@+id/button_web"
tools:layout_editor_absoluteX="0dp" />服務器
<Button
android:id="@+id/button_web"
android:layout_width="170dp"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:onClick="onClickWeb"
android:text="@string/button_web"
app:layout_constraintTop_toBottomOf="@+id/button2"
tools:layout_editor_absoluteX="0dp" />
<Button
android:id="@+id/button_allinone"
android:layout_width="175dp"
android:layout_height="wrap_content"
android:layout_marginTop="52dp"
android:onClick="onClickAllinOne"
android:text="@string/button_allinone"
app:layout_constraintTop_toBottomOf="@+id/button_client"
tools:layout_editor_absoluteX="0dp" />
<TextView
android:id="@+id/token_text_view"
android:layout_width="fill_parent"
android:layout_height="121dp"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp"
android:textSize="12sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintTop_toBottomOf="@+id/button_allinone"
tools:layout_editor_absoluteX="0dp" />
相關一字串對應信息以下:
strins.xml
<string name="button_client">weibo_client_oauth</string>
<string name="button_web">weibo_web_oauth</string>
<string name="button_allinone">weibo_allinone_oauth</string>
'''
在對應activity中分別實現。
建立Constants.java保存APP_KEY/REDIRECT_URL/SCOPE 等信息。
其中在使用前調用Wb.install
'''
WbSdk.install(this,new AuthInfo(this,Constants.APP_KEY,Constants.REDIRECT_URL,Constants.SCOPE));
private AuthInfo mAuthInfo;
private Oauth2AccessToken mAccessToken;
private SsoHandler mSsoHandler;
mSsoHandler = new SsoHandler(WeiboOAuthActivity.this);
//client
public void onClickClint(View view)
{
mSsoHandler.authorizeClientSso(new SelfWbAuthListener());
Log.d("youdias","test on click client");
Log.i("發起受權成功","受權成功");
// 從 SharedPreferences 中讀取上次已保存好 AccessToken 等信息,
// 第一次啓動本應用,AccessToken 不可用
mAccessToken = com.sina.weibo.sdk.auth.AccessTokenKeeper.readAccessToken(this);
}
//web
//onClickWeb
public void onClickWeb(View view)
{
mSsoHandler.authorizeWeb(new SelfWbAuthListener());
Log.d("youdias","test on click web");
// 從 SharedPreferences 中讀取上次已保存好 AccessToken 等信息,
// 第一次啓動本應用,AccessToken 不可用
mAccessToken = com.sina.weibo.sdk.auth.AccessTokenKeeper.readAccessToken(this);
}
//allinone
public void onClickAllinOne(View view)
{
//mSsoHandler.authorizeClientSso(new SelfWbAuthListener());
mSsoHandler.authorize(new SelfWbAuthListener());
Log.d("youdias","test on click onClickAllinOne");
Log.i("發起受權成功","受權成功");
// 從 SharedPreferences 中讀取上次已保存好 AccessToken 等信息,
// 第一次啓動本應用,AccessToken 不可用
mAccessToken = com.sina.weibo.sdk.auth.AccessTokenKeeper.readAccessToken(this);
}
//https://blog.csdn.net/yangxuan00/article/details/53391319
private class SelfWbAuthListener implements com.sina.weibo.sdk.auth.WbAuthListener{
@Override
public void onSuccess(final Oauth2AccessToken token) {
WeiboOAuthActivity.this.runOnUiThread(new Runnable() {
@Override
public void run() {
mAccessToken = token;
if (mAccessToken.isSessionValid()) {
// 顯示 Token
// 保存 Token 到 SharedPreferences
Map m=new HashMap();
m.put("access_token",mAccessToken.getToken());
m.put("uid",mAccessToken.getUid());
com.sina.weibo.sdk.auth.AccessTokenKeeper.writeAccessToken(WeiboOAuthActivity.this, mAccessToken);
//UnityPlayer.UnitySendMessage("ThirdLoginGameobject","WeiboCallBack", JSON.toJSONString(m));
//Log.i("accesstoken",JSON.toJSONString(m));
finish();
}
}
});
}
@Override
public void cancel() {
Log.i("取消受權","取消受權成功");
}
@Override
public void onFailure(WbConnectErrorMessage errorMessage) {
Toast.makeText(WeiboOAuthActivity.this, errorMessage.getErrorMessage(), Toast.LENGTH_LONG).show();
}
}
'''
這樣作下來若是受權成功則會得到微博u_id,不過本身作下來web 認證能夠正常識別出test Android名稱,而且正常得到u_id,而若是使用client方式則不能正確識別出應用名稱,顯示未經過審覈...,並且點擊肯定後並無按照預期得到u_id,問題須要後面繼續查看,不過至少目前可以知足本身需求了。
以上就是在學習微博第三方登陸時候記錄下的可以成功的流程。
參考連接:1.https://blog.csdn.net/csdn3436/article/details/676391812.http://open.weibo.com/wiki/Connect/login3.http://open.weibo.com/wiki/受權機制4.http://open.weibo.com/wiki/網站接入介紹5.https://github.com/xiaosier/libweibo6.https://www.cnblogs.com/520fyl/p/5405388.html7.https://github.com/sinaweibosdk/weibo_android_sdk8.https://blog.csdn.net/pkandroid/article/details/729837579.http://open.weibo.com/wiki/移動客戶端接入#SDK.E6.8E.A5.E5.85.A5.E6.B5.81.E7.A8.8B10.https://www.cnblogs.com/chaotianque/p/7717866.html