第三方登录简介:
个人理解第三方登录就是借助第三方服务器完成验证认证过程,即登录用户的合法性由第三方来确认,常见的有微博登录、微信登录、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即可。
然后可以根据需要进行对应的修改,
'''
$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>
'''
通过上面三句话提供了微博认证的链接,点击后就进行了微博认证,无论账户密码登录还是扫码登录,此时是在微博的server上进行,然后会调到前面指定的回调页面,可以在这里进行一些处理,比如进行判断是否授权成功,如果失败了继续回到前面请求授权,如果授权成功则会拿到AccessToken,使用AccessToken获取需要的信息。
'''
$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_id
'''
通过上面可以获得u_id,这个对于微博账户来说是唯一的,可以通过这个值对微博账户识别。当然也可跟根据需要获取其他想要的信息。
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.xml
'''
<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/67639181
2.http://open.weibo.com/wiki/Connect/login
3.http://open.weibo.com/wiki/授权机制
4.http://open.weibo.com/wiki/网站接入介绍
5.https://github.com/xiaosier/libweibo
6.https://www.cnblogs.com/520fyl/p/5405388.html
7.https://github.com/sinaweibosdk/weibo_android_sdk
8.https://blog.csdn.net/pkandroid/article/details/72983757
9.http://open.weibo.com/wiki/移动客户端接入#SDK.E6.8E.A5.E5.85.A5.E6.B5.81.E7.A8.8B
10.https://www.cnblogs.com/chaotianque/p/7717866.html