仿新浪微博2014之登陆界面三(授权认证Oauth2.0)

目前微博SDK为开发者提供三种授权方式:

 
  SSO授权:有客户端时使用 SSO 授权登陆;无客户端时自动唤起 Web 授权
  Web 授权:在没有客户端的情况下,可直接使用该授权
  Code码授权:无须应用的包名和签名,通过应用的APP_KEY和APP_SECRET授权

为了简单起见,我们使用了Code码授权

准备工作:

1、申请应用程序的APP_KEY
      用户首先需要在微博开放平台上对应用进行注册,并获取APP_KEY,添加应用的授权回调页(Redirect URI)

      这里我直接使用新浪微博Android SDK中的APP_KEY和授权回调页

public interface Constants { 
    public static final String APP_KEY      = "2045436852";       // 应用的APP_KEY 
    public static final String REDIRECT_URL = "http://www.sina.com";// 应用的回调页 
    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"; 
}


 

2、集成新浪微博Android SDK

     有两种方式:

     (1) 直接导入weibosdkcore.jar:适用于只需要授权、分享、网络请求框架功能的项目
  (2) 引用WeiboSDK工程(Library):适用于微博授权、分享,以及需要登陆按钮、调用OpenAPI的项目

3、授权主要API

(1)认证授权类

mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE);

(2)实现WeiboAuthListener接口
授权成功后,SDK会将access_token、expires_in、uid等通过Bundle的形式返回,在onComplete函数中,可以获取该信息。

class AuthListener implements WeiboAuthListener { 
    @Override 
public void onComplete(Bundle values) { 
   mAccessToken = Oauth2AccessToken.parseAccessToken(values); // 从 Bundle 中解析 Token 
        if (mAccessToken.isSessionValid()) { 
             AccessTokenKeeper.writeAccessToken(WBAuthActivity.this, mAccessToken); //保存Token 
        ......... 
        } else { 
        // 当您注册的应用程序签名不正确时,就会收到错误Code,请确保签名正确 
            String code = values.getString("code", ""); 
             ......... 
        } 
} 
......... 
} 

(3)直接调用WeiboAuth#anthorize方法,获取Code码:mWeiboAuth.authorize(new AuthListener(), WeiboAuth.OBTAIN_AUTH_CODE); //不需要应用包名和签名

(4)通过Code码与app_secret,进行HTTP请求,获取Token:fetchTokenAsync(mCode, WEIBO_DEMO_APP_SECRET); //通过应用的APP_SCRET来实现授权

public void fetchTokenAsync(String authCode, String appSecret)
	{
		WeiboParameters requestParams = new WeiboParameters();
		requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_ID, Constants.APP_KEY);
		requestParams.put(WBConstants.AUTH_PARAMS_CLIENT_SECRET, appSecret);
		requestParams.put(WBConstants.AUTH_PARAMS_GRANT_TYPE,
				"authorization_code");
		requestParams.put(WBConstants.AUTH_PARAMS_CODE, authCode);
		requestParams.put(WBConstants.AUTH_PARAMS_REDIRECT_URL,
				Constants.REDIRECT_URL);
		// 异步请求,获取 Token
		AsyncWeiboRunner.requestAsync(OAUTH2_ACCESS_TOKEN_URL, requestParams,
				"POST", new RequestListener()
				{
					@Override
					public void onComplete(String response)
					{
						LogUtil.d(TAG, "Response: " + response);
						Oauth2AccessToken token = Oauth2AccessToken
								.parseAccessToken(response);
						if (token != null && token.isSessionValid())
						{
							LogUtil.d(TAG, "Success! " + token.toString());

							mCurUser = new UserInfo();
							mAccessToken = token;
							mCurUser.setUserId(mAccessToken.getUid());
							mCurUser.setToken(mAccessToken.getToken());
							mCurUser.setUserExpiresin(mAccessToken.getExpiresTime());
							mUsersAPI = new UsersAPI(mAccessToken);
							long uid = Long.parseLong(mAccessToken.getUid());
							mUsersAPI.show(uid, mListener);

						} else
						{
							LogUtil.d(TAG, "Failed to receive access token");
						}
					}

					@Override
					public void onWeiboException(WeiboException e)
					{
						LogUtil.e(TAG, "onWeiboException: " + e.getMessage());
						Toast.makeText(LoginActivity.this, "获取Token失败",
								Toast.LENGTH_SHORT).show();
					}
				});
	}

获取到Token后就保存到数据库中,下次登录就不用认证了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值