zoukankan      html  css  js  c++  java
  • 新浪微博OAuth2.0的用法

    最近学习Android开发,照着视频开发新浪微博,但是视频里的介绍的是OAuth1.0的授权方式,试了半天发现用不了。

    原来现在一般没审核的用户只能使用OAuth2.0了,视频教学里的方法已经过时了。于是只好自己研究如何进行微博认证。

    OAuth2.0的授权过程

    说白了,就是请求获取Grant Code→使用Grant Code申请Access Token→以后就使用这个Access Token获取微博的服务,这比OAuth1.0的授权方式简化了不少。

    如果不使用别的第三方OAuth认证的库或者自己开发认证方法的话,初入门可以直接使用新浪提供的SDK,简单方便,而且说明详细。

    http://open.weibo.com/wiki/SDK#Android_SDK这个地址下载新浪的sdk库weibosdkcore.jar

    然后倒入到Android的项目中

    将官方的提供SDK JAR包(weibosdkcore.jar)放到工程的libs目录下
    添加JAR包:工程→右键→properties→java build path→libraries→add external jar

    新浪的这个SDK支持三种方法的认证,SSO认证、Web认证、Code认证。这个Code认证就是很多教学视频里使用的根据APP_KEY和APP_SECRET获取Token和Token_secret的方法。另外两个方法自己研究吧。

    使用新浪的SDK完成认证就是两句话

    Scope说明可以看http://open.weibo.com/wiki/Scope#scope.E8.AF.B4.E6.98.8E

    1 WeiboAuth wa = new WeiboAuth(OAuthActivity.this, APP_KEY, REDIRECT_URL, "all");//最后一个参数是Scope
    2 wa.authorize(new AuthListener(),WeiboAuth.OBTAIN_AUTH_CODE);//这个AuthListener是要自己实现的

    获取Grant Code

    AuthListener是继承WeiboAuthListener的一个实现,当输入完成账号密码,完成授权后就会回调这个实现。

    public class AuthListener implements WeiboAuthListener {
            /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能  */
            private Oauth2AccessToken mAccessToken;
            @Override
            public void onCancel() {
                Log.i("AuthListener","----auth canceled");
            }
    
            /**
             * 微博认证授权回调类。
             * 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
             *    该回调才会被执行。
             * 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
             * 当授权成功后,请保存该 access_token、expires_in、uid 等信息到 SharedPreferences 中。
             */
            @Override
            public void onComplete(Bundle arg0) {
                // 从 Bundle 中解析 Code
                if (null == arg0) {
                    Log.e("AuthListener", "obtain auth code fail!");
                    return;
                }
                
                String code = arg0.getString("code");
                mCode = code;
                if (TextUtils.isEmpty(code)) {
                    Log.e("AuthListener", "obtain auth code fail!");
                    return;
                }
                
                //进行授权的下一步
                fetchTokenAsync(mCode, APP_SECRET);//这是异步获取Token
            }
    
            @Override
            public void onWeiboException(WeiboException arg0){
                Log.i("AuthListener","----"+arg0.getMessage());
            }
    
        }

    获取Access Token

    获取Token,如果成功,那么授权就完成了。

    /**
         * 异步获取 Token。
         * 
         * @param authCode  授权 Code,该 Code 是一次性的,只能被获取一次 Token
         * @param appSecret 应用程序的 APP_SECRET,请务必妥善保管好自己的 APP_SECRET,
         *                  不要直接暴露在程序中,此处仅作为一个DEMO来演示。
         */
        public void fetchTokenAsync(String authCode, String appSecret) {
            
            WeiboParameters requestParams = new WeiboParameters();
            requestParams.put("client_id",     APP_KEY);
            requestParams.put("client_secret", appSecret);
            requestParams.put("grant_type",    "authorization_code");
            requestParams.put("code",          authCode);
            requestParams.put("redirect_uri",  REDIRECT_URL);
            
            // 异步请求,获取 Token
            AsyncWeiboRunner.requestAsync(ACCESS_TOKEN_URL, requestParams, "POST", new RequestListener() {
                @Override
                public void onComplete(String response) {
                    Log.d(TAG, "Response: " + response);
                    
                    // 获取 Token 成功,Oauth2AccessToken是一个封装了"access_token","expires_in","refresh_token"的类
                    Oauth2AccessToken token = Oauth2AccessToken.parseAccessToken(response);
                    if (token != null && token.isSessionValid()) {
                        Log.d(TAG, "Success! " + token.toString());
                        
                        mAccessToken = token;
                        
                        Toast.makeText(OAuthActivity.this, 
                                "授权成功 Token="+token.getToken(), Toast.LENGTH_SHORT).show();
                    } else {
                        Log.d(TAG, "Failed to receive access token");
                    }
                }
    
                @Override
                public void onWeiboException(WeiboException e) {
                    Log.e(TAG, "onWeiboException: " + e.getMessage());
                    Toast.makeText(OAuthActivity.this, 
                            "授权异常" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            });
        }
  • 相关阅读:
    c# 并行运算二
    c# 并行运算
    Task+http请求
    Task多线程
    SSO系统认证
    web系统权限设计
    AutoMapper的使用
    中间件
    express-middleware
    中间件概念
  • 原文地址:https://www.cnblogs.com/cxjchen/p/3731061.html
Copyright © 2011-2022 走看看