> >

 

Android 第三方登录

1、第三方登录的定义

所谓的第三方登录,就是利用用户在第三方平台上已有的账号来快速完成自己应用的登录或者注册的功能。而这里的第三方平台,一般是已经有大量用户的平台,如国内的新浪微博、QQ空间,微信,外国的Facebook、twitter等等。第三方登录不是一个具体的接口,而是一种思想或者一套步骤。
要实现第三方登录,首先你需要选择一个第三方平台。新浪微博和QQ空间都是好的选择,这些平台拥有大量的用户,而且还开放了API,供我们调用接入。

1、开放了API
2、具备获取用户资料或至少可以进行授权验证

其实ShareSDK已经支持了超过20种这样子的平台,完全足够你选择使用。

2、第三方登录实现方法

选择好平台以后,现在思考下面的问题:

你的应用是否具备独立账户系统?

这个问题是第三方登录时接口选择的重要标准。如果你选择“是”,则意味着你的应用只是需要第三方平台的用户,而不是他们的账户验证功能——也就是“要数据,不要功能”。而如果你选择“否”,则表示你实际上是’“要功能,不要数据(用户)”’。对于ShareSDK来说,前者你的入口方法是showUser(null),而后者是authorize()。那么下面我分情况解释两种接入方式的步骤。

 

要数据,不要功能

如果你的应用拥有用户系统,就是说你的应用自己就有注册和登录功能,使用第三方登录只是为了拥有更多用户,那么你可以依照下面的步骤来做:

1、用户触发第三方登录事件
2、showUser(null)请求授权用户的资料(这个过程中可能涉及授权操作)
3、如果onComplete()方法被回调,将其参数Hashmap代入你应用的Login流程
4、否则提示错误,调用removeAccount(true)方法,删除可能的授权缓存数据
5、Login时客户端发送用户资料中的用户ID给服务端
6、服务端判定用户是已注册用户,则引导用户进入系统,否则返回特定错误码
7、客户端收到“未注册用户”错误码以后,代入用户资料到你应用的Register流程
8、Register时在用户资料中挑选你应用的注册所需字段,并提交服务端注册
9、服务端完成用户注册,成功则反馈客户端引导用户进入系统
10、否则提示错误,调用removeAccount(true)方法,删除可能的授权缓存数据

要功能,不要数据

如果你的应用不具备用户系统,而且也不打算维护这个系统,那么你可以依照下面的步骤来做:

1、用户触发第三方登录事件
2、调用platform.getDb().getUserId()请求用户在此平台上的ID
3、如果用户ID存在,则认为用户是合法用户,允许进入系统;否则调用authorize()
4、authorize()方法将引导用户在授权页面输入帐号密码,然后目标平台将验证此用户
5、如果onComplete()方法被回调,表示授权成功,引导用户进入系统
6、否则提示错误,调用removeAccount(true)方法,删除可能的授权缓存数据

3、实例代码

下面利用一段实例代码来讲述第三方登录的一些基本步骤,但由于ShareSDK并没有用户帐户系统,因此这不是一个可以直接拿来套用的例子,不过开发者只要阅读并理解代码,就可以轻松实现第三方登录了。
实例代码演示的是“要功能,不要数据”的情况,事实上这是“要数据,不要功能”类型的子集,只是“要数据,不要功能”类型剩下的步骤是你应用的客户端和服务端之间的登录和注册操作,和ShareSDK已经没什么关系了。
首先是项目的Github地址:

https://github.com/ShareSDKPlatform/ThirdPartyLoginDemo

接下来,如果你还不清楚ShareSDK的接口调用方法,请参考一下下面的条目:
1、授权
2、获取用户资料

然后再来讲解一下实例中的部分主要代码:

private void authorize(Platform plat) {
 if (plat == null) {
 popupOthers();
 return;
 }
//判断指定平台是否已经完成授权
if(plat.isAuthValid()) {
 String userId = plat.getDb().getUserId();
 if (userId != null) {
 UIHandler.sendEmptyMessage(MSG_USERID_FOUND, this);
 login(plat.getName(), userId, null);
 return;
 }
 }
 plat.setPlatformActionListener(this);
 // true不使用SSO授权,false使用SSO授权
plat.SSOSetting(true);
 //获取用户资料
 plat.showUser(null);
 }

上面的代码是当用户触发第三方登录按钮的时候的处理。plat.isAuthValid()判断指定平台是否已经完成授权,如果已经完成授权,ShareSDK的用户数据库应该已经存在userId,用此ID来执行登录。如果此平台没有完成授权,则调用plat.showUser(null)方法来获取用户资料。
获取用户资料以后,并不能立刻用来注册,因为可能只是因为授权时间太久导致AccessToken过期,因此完成授权以后需要先将userId发送给你应用的服务端进行检查,如果服务端发现确实没有注册过,才引导客户端进入注册页面。
下面是一些截图:
320px-device-2013-06-13-185651    320px-device-2013-06-13-190139

320px-device-2013-06-13-190313    320px-device-2013-06-13-190357

下面对微信的第三方登录说明一下:

Demo:wechatlogin  此demo中有打包需要的keystore,密码是123456,微信登录需要正式打包签名测试

1、首先要把资源和微信的jar包复制到工程中,保证微信的开放平台的登录的权限一定要审核通过;

weixin01

2、添加授权代码

Platform wechat= ShareSDK.getPlatform(Wechat.NAME);
wechat.setPlatformActionListener(paListener);
wechat.authorize();

3、申请key后替换sharesdk.xml默认的key

<Wechat
Id="4"
SortId="4"
AppId="wx4868b35061f87885"
AppSecret="64020361b8ec4c99936c0e3999a9f249"
BypassApproval="false"
Enable="true" />

<WechatMoments
Id="5"
SortId="5"
AppId="wx4868b35061f87885"
AppSecret="64020361b8ec4c99936c0e3999a9f249"
BypassApproval="false"
Enable="true" />

 

4、配置Manifest文件,配置sharesdk和配置微信回调

  <activity
        android:name="com.mob.tools.MobUIShell"
        android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:configChanges="keyboardHidden|orientation|screenSize"
        android:windowSoftInputMode="stateHidden|adjustResize">

 

<!--微信分享回调 -->
<activity
	android:name=".wxapi.WXEntryActivity"
	android:theme="@android:style/Theme.Translucent.NoTitleBar"
        android:configChanges="keyboardHidden|orientation|screenSize"
	android:exported="true"
	android:screenOrientation="portrait" />

还要特殊说明的是想要获取第三方登录后用户的信息可以参考获取用户资料的文档。

注意:微信登录必须要正式打包签名才可以,微信打包签名可以看此处里面有对签名填写的说明。