zoukankan      html  css  js  c++  java
  • 手把手教您使用第三方登录

     今天讲一下第三方登录

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

    主流第三方登录包括:微信、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

  • 相关阅读:
    推荐19个很有用的 JavaScript 库
    李开复:我对年轻人是分享经验 不是要当导师
    DotNET企业架构应用实践数据库表记录的唯一性设计的设计兼议主键设定原则
    cookies,session,viewstate浅析
    不是HR,Leader你到底需要招什么样的程序员(变形金刚?超人?可能吗!)
    IBatis.Net学习笔记系列文章
    学习mvc的一些资料
    数据库日常维护常用的脚本部分收录
    设定Grid行的颜色
    被WSS3.0耍了一把
  • 原文地址:https://www.cnblogs.com/wanghang/p/6299502.html
Copyright © 2011-2022 走看看