新浪微博OAuth2.0授权

最近学习新浪微博的开发。之前没有使用第三方API开发的经验,多方查阅之后得知要想调用新浪微博官方API首先要进行对自己的应用进行OAuth授权。我对OAuth的理解也不是特别深刻,OAuth是一个为 用户,用户信息存储服务器以及第三方应用程序之间所提供 的更加安全可靠地数据使用协议。其主要为了解决第三方应用程序访问用户存储在服务器上的数据时用户名密码的可能出现泄漏的问题,OAuth协议的出现,使得第三方不需要用户名和密码就可以访问服务器上的数据。说的不是很详细,网上有很多大牛对OAuth解释的都很透彻,不懂得就百度吧。下面我说一下OAuth的授权过程,以及我在学习过程中遇到的问题。

1.申请App key以及填写redirect_url

进行OAuth授权之前首先要去新浪微博开发者平台(http://open.weibo.com/)申请创建自己的APP,创建App后会会自动生成一个专属你的App的一个app key 和app secret,App key对于Oauth授权是必不可少的。这个过程也是很简单。


2.下载官方SDK,我是做的android APP所以我下载的是新浪官方提供android sdk。(http://open.weibo.com/wiki/SDK#Android_SDK

下载后解压

我们可以运行官方的授权以及分享的demo,看看是怎么一个过程。如何运行可以参照解压后的那个pdf文档。


3.将官方提供的授权移植到我们自己的项目中

首先要将导官方的jar包或者导入官方SDK,根据需要而定,文档中已经说的很详细了。

然后把官方的Constants类复制到自己的项目中,这时要用到之前生成的 app key 以及redirect_url(官方推荐的redirect_url是https://api.weibo.com/oauth2/default.html,我是新手当然是听官方的)。

有了这个Contanst类就好了。

现在我想实现点击下图的按钮就出来官方demo中的授权页(页面巨丑,见谅,我是菜鸟)



上代码

package com.example.iweibo;

import com.lql.oauth.Constants;
import com.sina.weibo.sdk.auth.Oauth2AccessToken;
import com.sina.weibo.sdk.auth.WeiboAuth;
import com.sina.weibo.sdk.auth.WeiboAuthListener;
import com.sina.weibo.sdk.auth.sso.SsoHandler;
import com.sina.weibo.sdk.exception.WeiboException;

import android.app.Activity;
import android.app.Dialog;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageButton;
import android.widget.Toast;

public class LoginActivity extends Activity implements View.OnClickListener {

	
	/** 微博 Web 授权类,提供登陆等功能 */
	private WeiboAuth mWeiboAuth;

	/** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
	private Oauth2AccessToken mAccessToken;


	private ImageButton btn_ok, btn_cancle;//btn_ok是确认按钮

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.oauth);
		init();
	}

	private void init() {
		// TODO Auto-generated method stub
		View diglogView = View.inflate(LoginActivity.this, R.layout.dialog,
				null);
		Dialog dialog = new Dialog(LoginActivity.this, R.style.dialog);
		dialog.setContentView(diglogView);
		dialog.setCanceledOnTouchOutside(false);
		dialog.show();

		// 创建微博实例
		mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY,
				Constants.REDIRECT_URL, Constants.SCOPE);

		btn_ok = (ImageButton) diglogView.findViewById(R.id.oauth_btn_ok);
		btn_cancle = (ImageButton) diglogView
				.findViewById(R.id.oauth_btn_cancel);
		btn_ok.setOnClickListener(this);
		btn_cancle.setOnClickListener(this);
	}

	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.oauth_btn_ok:
			mWeiboAuth.anthorize(new AuthListener());
			break;

		default:
			break;
		}
	}

	/**
	 * 微博认证授权回调类。 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用
	 * {@link SsoHandler#authorizeCallBack} 后, 该回调才会被执行。 2. 非 SSO
	 * 授权时,当授权结束后,该回调就会被执行。 当授权成功后,请保存该 access_token、expires_in、uid 等信息到
	 * SharedPreferences 中。
	 */
	public class AuthListener implements WeiboAuthListener {

		@Override
		public void onCancel() {
			// TODO Auto-generated method stub
			Toast.makeText(LoginActivity.this,
					R.string.weibosdk_demo_toast_auth_canceled,
					Toast.LENGTH_LONG).show();
		}

		@Override
		public void onComplete(Bundle values) {
			// TODO Auto-generated method stub
			// 从 Bundle 中解析 Token
			mAccessToken = Oauth2AccessToken.parseAccessToken(values);
			if (mAccessToken.isSessionValid()) {
				// 显示 Token
				Toast.makeText(
						LoginActivity.this,
						"uid---》" + mAccessToken.getUid() + "--access->"
								+ mAccessToken.getToken() + "--expeir->"
								+ mAccessToken.getExpiresTime(),
						Toast.LENGTH_SHORT).show();
			} else {
				// 当您注册的应用程序签名不正确时,就会收到 Code,请确保签名正确
				String code = values.getString("code");
				String message = getString(R.string.weibosdk_demo_toast_auth_failed);
				if (!TextUtils.isEmpty(code)) {
					message = message + "\nObtained the code: " + code;
				}
				Toast.makeText(LoginActivity.this, message, Toast.LENGTH_LONG)
						.show();
			}
		}

		@Override
		public void onWeiboException(WeiboException e) {
			// TODO Auto-generated method stub
			Toast.makeText(LoginActivity.this, 
                    "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG).show();
		}
	}
}

其中的授权代码是我从官方demo中的WBAuthActivity中copy的,官方提供了多种授权方式,我采用的是第一种(通过应用签名信息获取 Token)

我这个完成之后,点击确认还是无法弹出授权页,而且弹出我用吐司弹出了一个Auth Exception:21338

我又查看了官方文档,发现少了一步,就是应用的签名和包名这一项我给漏了。

4.生成应用签名

在模拟器上安装这个app_signatures.apk用于获取应用签名


要确保你自己的应用于这个app_signatures.apk在同一个模拟器上


包名是你的应用中AndroidManifest.xml中的package节点的包名

填写的时候一定要注意不能有多余的空格,这里坑了我好久,我都没发现空格。

5.生成后将这个签名后包名填写到在官网上申请的应用信息中


Android下载地址随便填写,只要是一个http:协议的网址即可

还有就是别忘了在AndroidMainfest.xml中添加所需要的权限

 <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
  <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
  <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

这时你在点击授权确认就可以了


我是按照我在这个过程中遇到的问题来写的,希望能帮到需要的人。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章