今天讲一下第三方登录
市面很多应用都有登录注册功能,有的公司自己建立服务器,自己完成功能。但是现在有一些公司为了节省开发时间,会选择第三方登录。回想自己刚学安卓那会,就想怎么才能实现登录注册,甚至傻傻的建立本地数据库,自己写加密算法加密用户名密码等等,殊不知安全问题得不到好的解决,效率也是低下。这也是开篇写第三方登录的原因。
主流第三方登录包括:微信、qq、网盘、短信等,该文章基于网盘登录,主流登录各大博客都有很详细的介绍,楼主也是读了好几篇相关博客才敢写这本文章。限于篇幅原因,暂时用不到核心的登录功能,就暂时讲一下微盘登录。但核心方式大同小异。网盘登录相对比较简单,也算拓展一下视野。虽然,网盘官网现在已经停用了,但是这个技术点还是比较有意义的,写在这里作为了解。
如果是实际开发,你需要到指定第三方平台,注册账号成为开发者,然后创建属于本公司的应用,平台会给你一个app Key和app Secret,这个东西非常重要。本篇直接使用官方Demo里面的这两个值,就不做申请过程了。
下载官方提供的lib和Demo。我给您打包好了,可以直接下载:http://download.csdn.net/my
那么先运行官网Demo,看看啥子效果:
是的,您没看错,就是曾经辉煌一时的新浪网盘,我们就借用新浪的登录功能,成为我们项目的一部分,人家是大公司,内部机制和保护错失肯定比自己实现起来靠谱的多吧。
接下来就开始代码编写了,手把手教您在自己的IDE中跑起来。
PS:如果您闲一步步的操作麻烦、繁琐,可以直接复制最终那个完整代码,跑起来也可,主要还是为了了解技术点嘛。
1、关联下载好的lib包。
2、新建一个LoginActivity,布局只用一个Button用于授权登录(作为点击事件跳转登录界面)。代码如下:
/****省略导包****/
public class LoginActivity extends Activity {
private Button mbtnLogin;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mbtnLogin = (Button) findViewById(R.id.bt_login);
mbtnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//事件用于授权登录
}
});
}
}
2、通过search功能在官方Demo找到授权登录的代码:
// 使用微盘Token认证,需设置重定向网址
// Need to set REDIRECT_URL if you want to use VDisk token.
session.setRedirectUrl(REDIRECT_URL);
session.authorize(OAuthActivity.this, OAuthActivity.this);
这块代码就是授权登录,也是核心一部分。我们加到自己Demo中:
@Override
public void onClick(View v) {
//事件用于授权登录
// 使用微盘Token认证,需设置重定向网址
// Need to set REDIRECT_URL if you want to use VDisk token.
session.setRedirectUrl(REDIRECT_URL);
session.authorize(OAuthActivity.this, OAuthActivity.this);
}
});
两行代码就是授权了,只要执行完这条代码,就会通过新浪服务器的授权(对于授权是什么,后面学的深入了肯定会讲解相关的知识)。session.setRedirectUrl(REDIRECT_URL);参数也是您官网注册开发者账号的时候,自己建立的一个网址,这个问题不大,使用官方Demo中的即可。看注释写的也很清楚:Need to set REDIRECT_URL if you want to use VDisk token.
session.authorize(LoginActivity.this, LoginActivity.this);发起授权请求,让用户输入账号/密码。只要两行代码成功,就会回到onComplete(Bundle values)方法。第一个参数是一个上下文,第二个参数是授权通过后的监听器。直接使用自己的活动就可以了,例如我的主活动LoginActivity,因而我们的活动还要实现这个监听回调方法。
/********** 2、处理授权结果——>>得到accessToken **********/
@Override
public void onComplete(Bundle values) {
//授权完成的回调,这里使我们关心的,即授权成功后我们要干嘛
}
@Override
public void onError(VDiskDialogError error) {
//授权出错
}
@Override
public void onVDiskException(VDiskException exception) {
//抽取按过程中有异常(不是错误)
}
@Override
public void onCancel() {
待会回来再讨论回调方法。
您会发现项目报错了,肯定的,因为你的好多对象没有初始化完毕。继续在Demo中拷贝初始化的代码。
以及上面所说的app Key、app Secret和REDIRECT_URL等
代码如下:
public class LoginActivity extends Activity implements VDiskDialogListener {
private Button mbtnLogin;
private VDiskAuthSession session;
/**
* 替换为开发者应用的appkey,例如"16*****960";
*
* Replace it to the appkey of developer's application, such as
* "16*****960";
*/
public static final String CONSUMER_KEY = "2330724462";// TODO
/**
* 替换为开发者应用的app secret,例如"94098*****************861f9";
*
* Replace it to the app secret of developer's application, such as
* "94098*****************861f9";
*/
public static final String CONSUMER_SECRET = "04f81fc56cc936bfc8f0fa1cef285158";// TODO
/**
* 替换为微博的access_token. 如果你想使用微博token直接访问微盘的API,这个字段不能为空。
*
* Replace it to the access_token of WEIBO. If you use weibo token to access
* VDisk API, this field should not be null.
*/
public static String WEIBO_ACCESS_TOKEN = "WEIBO_ACCESS_TOKEN";
/**
*
* 此处应该替换为与appkey对应的应用回调地址,对应的应用回调地址可在开发者登陆新浪微盘开发平台之后,进入"我的应用--编辑应用信息--回调地址"
* 进行设置和查看,如果使用微盘token登陆的话, 应用回调页不可为空。
*
* The content of this field should replace with the application's redirect
* url of corresponding appkey. Developers can login in Sina VDisk
* Development Platform and enter "我的应用--编辑应用信息--回调地址" to set and view the
* corresponding application's redirect url. If you use VDisk token, the
* redirect url should not be empty. should not be empty.
*/
private static final String REDIRECT_URL = "http://vauth.appsina.com/callback1.php";// TODO
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mbtnLogin = (Button) findViewById(R.id.bt_login);
/**
* 初始化 Init
*/
AppKeyPair appKeyPair = new AppKeyPair(CONSUMER_KEY, CONSUMER_SECRET);
/**
* @AccessType.APP_FOLDER - sandbox 模式
* @AccessType.VDISK - basic 模式
*/
session = VDiskAuthSession.getInstance(this, appKeyPair,
AccessType.VDISK);
mbtnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
//事件用于授权登录
// 使用微盘Token认证,需设置重定向网址
// Need to set REDIRECT_URL if you want to use VDisk token.
session.setRedirectUrl(REDIRECT_URL);
//1、发起授权请求,让用户输入账号/密码
session.authorize(LoginActivity.this, LoginActivity.this);
}
});
}
/********** 2、处理授权结果——>>得到accessToken **********/
@Override
public void onComplete(Bundle values) {
//授权完成的回调,这里使我们关心的,即授权成功后我们要干嘛
}
@Override
public void onError(VDiskDialogError error) {
//授权出错
}
@Override
public void onVDiskException(VDiskException exception) {
//抽取按过程中有异常(不是错误)
}
@Override
public void onCancel() {
//授权取消
}
}
还是,不要觉得繁琐,直接拷贝就行。
最后在再看看监听回调:
总共四个方法,注释写的很清楚了。我们最关心的,也就是
public void onComplete(Bundle values) {}了,一旦走到这里,就是我们要干的事情了,例如启动服务、跳转页面等等。注意的是,我们要在这里面处理服务器返回的accessToken,处理最终结果。还是去官方Demo中看如何处理最后授权结果吧。
@Override
public void onComplete(Bundle values) {
if (values != null) {
AccessToken mToken = (AccessToken) values
.getSerializable(VDiskAuthSession.OAUTH2_TOKEN);
session.finishAuthorize(mToken);
}
startActivity(new Intent(this, VDiskTestActivity.class));
finish();
}
我们处理完了accessToken,就是做了自己的事情——跳转到MainActivity。
对了,记得LoginActivity要在配置文件作为主活动、添加配置MainActivity哦。可以运行起来看看高大上的结果了~
额,没错。程序崩溃了,哈哈。因为你没有配置相应的权限,这些权限是啥,鬼知道是什么,但是官方Demo中有啊,去拷贝吧!
<uses-permission android:name="android.permission.INTERNET" >
</uses-permission>
<uses-permission android:name="android.permission.READ_PHONE_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" >
</uses-permission>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
这个时候运行起来,可以完美实现微盘登录了,而且,我们把它的登录功能,变成了自己的,的确高大上,略显牛逼了吧。
到此第三方登录讲解完毕,后续参与实际开发用到更多核心功能的时候,还会去更细致的写这方面的文章,看在苦劳的份上,留下您的脚印,关注我哈。
您看一看文章也就5-10分钟,笔者要花1个多小时才能完成,喜欢我的朋友在下面留言点赞,关注我一起讨论问题哈。
长按上方二维码,关注本公众号每天更新一篇安卓文章。
或者加入开发技术交流群:497646615