第三方登陆简介:
我的理解第三方登陆就是借助第三方服务器完成验证认证过程,即登陆用户的合法性由第三方来确认,常见的有微博登陆、微信登陆、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