今天讲一下第三方登录

市面很多应用都有登录注册功能,有的公司自己建立服务器,自己完成功能。但是现在有一些公司为了节省开发时间,会选择第三方登录。回想自己刚学安卓那会,就想怎么才能实现登录注册,甚至傻傻的建立本地数据库,自己写加密算法加密用户名密码等等,殊不知安全问题得不到好的解决,效率也是低下。这也是开篇写第三方登录的原因。

主流第三方登录包括:微信、qq、网盘、短信等,该文章基于网盘登录,主流登录各大博客都有很详细的介绍,楼主也是读了好几篇相关博客才敢写这本文章。限于篇幅原因,暂时用不到核心的登录功能,就暂时讲一下微盘登录。但核心方式大同小异。网盘登录相对比较简单,也算拓展一下视野。虽然,网盘官网现在已经停用了,但是这个技术点还是比较有意义的,写在这里作为了解。

如果是实际开发,你需要到指定第三方平台,注册账号成为开发者,然后创建属于本公司的应用,平台会给你一个app Key和app Secret,这个东西非常重要。本篇直接使用官方Demo里面的这两个值,就不做申请过程了。

下载官方提供的lib和Demo。

那么先运行官网Demo,看看啥子效果:

android keystore申请_ide


是的,您没看错,就是曾经辉煌一时的新浪网盘,我们就借用新浪的登录功能,成为我们项目的一部分,人家是大公司,内部机制和保护错失肯定比自己实现起来靠谱的多吧。

接下来就开始代码编写了,手把手教您在自己的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" />

这个时候运行起来,可以完美实现微盘登录了,而且,我们把它的登录功能,变成了自己的,的确高大上,略显牛逼了吧。

android keystore申请_网盘_02

到此第三方登录讲解完毕,后续参与实际开发用到更多核心功能的时候,还会去更细致的写这方面的文章,看在苦劳的份上,留下您的脚印,关注我哈。