新浪微博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" />

這時你在點擊授權確認就可以了


我是按照我在這個過程中遇到的問題來寫的,希望能幫到需要的人。

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