使用Oauth2.0实现微博授权登录

本文章参考资料:
http://blog.csdn.net/highboys/article/details/52139268
http://blog.csdn.net/yypsober/article/details/51720355?locationNum=3&fps=1

现在实现第三方授权登录都是通过Oauth2.0来实现,然而关于Oauth2.0的理解和用法,我现在还在学习中,具体可以看这里。虽然实现方式有各种各样,我这里就实现一下最常规的通过Oauth2.0实现微博授权登录,具体的实现如下图

使用Oauth2.0实现微博授权登录_第1张图片
使用Oauth2.0实现微博授权登录_第2张图片使用Oauth2.0实现微博授权登录_第3张图片
如上面的图,总共用了三种实现方式
1.SSO单点登录:前提是你的手机上装了微博的app,否则报错
2.web页面登录:弹出一个web界面,然后实现账号密码登录
3.All in one方式授权登录:自动识别如果手机拥有微博app就通过SSO单点登录,没有的话就通过web页面登录,该功能比较人性化,这也是第三方登录常用的方式

接下来就开始正式的教程了

一、到http://open.weibo.com/注册一个微博开发者账号

首先,注册->注册成功->微连接->移动应用->立即接入->填写名字,应用创建->打开应用信息->基础信息按要求填写:如下
使用Oauth2.0实现微博授权登录_第4张图片
这里的报名就是你创建android工程时的包名,Android签名的话页面有提示使用他提示的android签名生成工具生成,你只需要将你创建的app运行在你手机上,然后再装上android签名生成,复制上去(所以第一步其实应该是先创建一个project的)其他一些基本按要求就行
另外还需要 应用信息->高级信息 填写回调页使用Oauth2.0实现微博授权登录_第5张图片
我这里填写的是http://www.sina.com,一般都是填写微博的默认回调页http://api.weibo.com/oauth2/default.html,道理来说也可以用自己公司网站什么的

二、前期准备

  • 下载微博的SDK:http://open.weibo.com/wiki/SDK
  • 在你创建的project中的main文件夹下创建jniLibs文件夹,将微博SDK的内容拷贝到这个文件夹下
    使用Oauth2.0实现微博授权登录_第6张图片
  • 另外还需导入weiboSDKCore_3.1.4.jar和weibosdk.jar
    这里写图片描述

三、逻辑整理

  • 我这里想实现两个Activity,第一个Activity通过这三个按钮实现登录,第二个activity显示用户的信息,所以有下图
    使用Oauth2.0实现微博授权登录_第7张图片
  • 看到是否有一个Constants,这里存放着一些公用的信息,例如:token,用户的信息,微博微应用创建时生成的App Key等等,代码如下
Constants.java
public class Constants {
    //用户信息
    public static String name = null;//名字
    public static String gender = null;//性别
    public static String location = null;//归属地
    public static String token = null;
    /** 当前 DEMO 应用的 APP_KEY,第三方应用应该使用自己的 APP_KEY 替换该 APP_KEY */
    public static final String APP_KEY      = "490704571";

    //填写自己创建时自己填的回调页url
    public static final String REDIRECT_URL = "http://www.sina.com";
     /*
     * Scope 是 OAuth2.0 授权机制中 authorize 接口的一个参数。
     * 目前 Scope 支持传入多个 Scope 权限,用逗号分隔。
     * 有关哪些 OpenAPI 需要权限申请,请查看:http://open.weibo.com/wiki/%E5%BE%AE%E5%8D%9AAPI
     * 关于 Scope 概念及注意事项,请查看:http://open.weibo.com/wiki/Scope
     */
    public static final String SCOPE =
            "email,direct_messages_read,direct_messages_write,"
                    + "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
                    + "follow_app_official_microblog," + "invitation_write";
}

第二个Activity如下
使用Oauth2.0实现微博授权登录_第8张图片
是的,就这么简陋(其实是拿了别人的代码懒得改)基本逻辑应该清楚了,那接下来应该是第三部了

四、编码

主要实现是在OauthActivity上。

  • 首先先把基本代码码好,初始化按钮和使用weiboSDK的WeiboAuthListener接口
public class OAuthActivity extends AppCompatActivity implements View.OnClickListener,WeiboAuthListener{

    //登录按钮
    private Button btnSsoLogIn;
    private Button btnWebLogIn;
    private Button btnAllInOneLogIn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        initView();
    }
    private void initView() {
        btnSsoLogIn = (Button) findViewById(R.id.logIn_btn_SsoLogin);
        btnSsoLogIn.setOnClickListener(this);
        btnWebLogIn = (Button) findViewById(R.id.logIn_btn_WebLogin);
        btnWebLogIn.setOnClickListener(this);
        btnAllInOneLogIn = (Button) findViewById(R.id.logIn_btn_AllInOneLogin);
        btnAllInOneLogIn.setOnClickListener(this);
    }
     /**
     * 微博认证授权回调类。
     * 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
     * 该回调才会被执行。
     * 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
     * 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
     */
    @Override
    public void onComplete(Bundle bundle) {
    }
    @Override
    public void onWeiboException(WeiboException e) {
        Toast.makeText(OAuthActivity.this, "授权异常", Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onCancel() {
        Toast.makeText(OAuthActivity.this, "授权取消", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onClick(View v) {
}
  • 接下来是实现功能的具体细节了。先定义以下几个变量
    /**
     * 注意:SsoHandler 仅当 SDK 支持 SSO 时有效
     */
    private SsoHandler mSsoHandler;
    private AuthInfo mAuthInfo;
    /**
     * 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能
     */
    private Oauth2AccessToken mAccessToken;
    //获取用户信息的接口(需要先把官方提供的weibosdk库引入到工程当中来)
    UsersAPI mUsersAPI;

然后在onCreate中实现

        // 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
        mAuthInfo = new AuthInfo(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);
        mSsoHandler = new SsoHandler(this, mAuthInfo);

为几个按钮实现监听

@Override
    public void onClick(View v) {
        switch (v.getId()) {
            //sso授权,仅客户端
            case R.id.logIn_btn_SsoLogin:
                startSsoWeiBoLogIn();
                break;
            //web授权
            case R.id.logIn_btn_WebLogin:
                startWebWeiBoLogIn();
                break;
            //自动检测,若有客户端,则用sso授权,若没有客户端则用web授权
            case R.id.logIn_btn_AllInOneLogin:
                startAllInOneWeiBoLogIn();
                break;
        }
    }

各按钮的动作

    /**
     * all in one 方式授权,自动检测
     */
    private void startAllInOneWeiBoLogIn() {
        mSsoHandler.authorize(this);
    }
    /**
     * Web授权
     */
    private void startWebWeiBoLogIn() {
        mSsoHandler.authorizeWeb(this);
    }
    /**
     * SSO授权,仅客户端
     */
    private void startSsoWeiBoLogIn() {
        mSsoHandler.authorizeClientSso(this);
        //通过accessToken获取用户信息
    }
  • 修改重写的onComplete和重洗函数onActivityResult
 @Override
    public void onComplete(Bundle bundle) {
        //从Bundle中解析Token
        mAccessToken = Oauth2AccessToken.parseAccessToken(bundle);
        if (mAccessToken.isSessionValid()) {//授权成功
            Constants.token = mAccessToken.getToken();
            Toast.makeText(OAuthActivity.this, "登陆成功", Toast.LENGTH_SHORT).show();
            //获取用户具体信息
            getUserInfo();
            //跳转页面
            Intent intent = new Intent(OAuthActivity.this,MainActivity.class);
            startActivity(intent);
            finish();
        } else {
            /**
             *  以下几种情况,您会收到 Code:
             * 1. 当您未在平台上注册应用程序的包名与签名时;
             * 2. 当您注册的应用程序包名与签名不正确时;
             * 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
             */
            String code = bundle.getString("code");//直接从bundle里边获取
            if (!TextUtils.isEmpty(code)) {
                Toast.makeText(OAuthActivity.this, "签名不正确", Toast.LENGTH_SHORT).show();
            }
        }
//            String phoneNum = mAccessToken.getPhoneNum();//通过手机短信授权登录时可以拿到,此demo未实现此种授权方式
    }

    /**
     * 1.仅sso授权时,当 SSO 授权 Activity 退出时,该函数被调用。
     * 2.仅
     */
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        //SSO 授权回调
        //重要:发起sso登录的activity必须重写onActivtyResults
        if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
    }
  • 还有就是获取用户信息
 /**
     * 获取用户个人信息
     */
    private void getUserInfo() {
        //获取用户信息接口
        mUsersAPI = new UsersAPI(OAuthActivity.this,Constants.APP_KEY,mAccessToken);
        System.out.println("mUsersAPI  ----->   " + mUsersAPI.toString());

        //调用接口
        long uid = Long.parseLong(mAccessToken.getUid());
        System.out.println("--------------uid-------------->    " + uid);
        mUsersAPI.show(uid, mListener);//将uid传递到listener中,通过uid在listener回调中接收到该用户的json格式的个人信息
    }

    /**
     * 实现异步请求接口回调,并在回调中直接解析User信息
     */
    private RequestListener mListener = new RequestListener() {
        @Override
        public void onComplete(String response) {
            if (!TextUtils.isEmpty(response)) {
                //调用User#parse将JSON串解析成User对象
                User user = User.parse(response);
                String nickName = user.screen_name;
                Constants.name = user.screen_name;
                Constants.gender = user.gender;
                Constants.location = user.location;
//                Toast.makeText(LogInActivity.this, "用户的昵称: " + nickName, Toast.LENGTH_SHORT).show();
            }
        }

        /**
         *如果运行测试的时候,登录的账号不是注册应用的账号,那么需要去:
         *开放平台-》管理中心-》应用信息-》测试信息-》添加测试账号(填写用户昵称)!
         * 否则便会抛出以下异常
         */
        @Override
        public void onWeiboException(WeiboException e) {
            e.printStackTrace();
            Toast.makeText(OAuthActivity.this, "获取用户个人信息 出现异常", Toast.LENGTH_SHORT).show();
        }
    };

最后

  • 道理来说是大功告成了
  • 上传我测试用的源代码,单击这里下载

你可能感兴趣的:(Android开发记录)