在網上找了很久也沒有發現比較好的android微博客戶端可以提供學習…有的也是非常老舊了…磨擦磨擦…完全跟不上時期的步伐.1怒之下,vio微博應運而生.
duang…
言歸正傳…新浪微博目前所采取的授權機制,已完全拋棄了OAuth1.0 ,轉向OAuth2.0.那末怎樣進行OAuth2.0的認證呢?
首先,我們了解1下OAuth2.0: OAuth2.0是1個全新的協議,對之前的版本不進行向后兼容,但OAuth2.0的整體架構與之前的OAuth架構卻是相同的.
OAuth2.0的認證流程:
(1)用戶打開客戶端以后,客戶端要求用戶給予授權
(2)用戶同意給予客戶端授權
(3)客戶端使用上1步取得的授權,向認證服務器申請令牌
(4)認證服務器對客戶端進行認證以后,確認無誤,同意發放令牌
(5)客戶端使用令牌,向資源服務器申請獲得資源
(6)資源服務器確認令牌無誤,同意向客戶端開放資源
OAuth2.0客戶端授權模式包括:
①授權碼模式(authorization code)
②簡化模式(implicit)
③密碼模式(resource owner password credentials
④客戶端模式(client credentials)
授權碼模式:
―> 用戶訪問客戶端,客戶端指向服務器(
參數:response_type:表示授權類型,必選項,此處的值固定為”code”
client_id:表示客戶真個ID,必選項(新浪微博app_key)
redirect_uri:表示重定向URI,可選項(新浪微博提供默許url)
scope:表示申請的權限范圍,可選項(可參照sdkdemo)
state:表示客戶真個當前狀態,可以指定任意值,認證服務器會原封不動地返回這個值。)
―> 用戶選擇是不是授權
―> 獲得用戶后,將用戶導向到redirect_uri,返回授權碼code
―> (此步驟用戶不可見) 利用服務器授權碼,向服務器申請1個access_token
―> 認證服務器核對了授權碼和重定向URI,無誤以后,返回參數(
參數:access_token:表示訪問令牌,必選項。
token_type:表示令牌類型,該值大小寫不敏感,必選項,可以是bearer類型或mac類型。
expires_in:表示過期時間,單位為秒。如果省略該參數,必須其他方式設置過期時間。
refresh_token:表示更新令牌,用來獲得下1次的訪問令牌,可選項。
scope:表示權限范圍,如果與客戶端申請的范圍1致,此項可省略)
我們使用的便是這類方式:其他3種此處不做介紹:(有興趣參考:http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
下面我們看1下我的vio微博的認證:
首先: 打開新浪微博開放平臺(http://open.weibo.com/) 完善個人信息 創建利用…
(如果是創建第2個利用,點擊微連接,移動利用就OK)
android簽名需要在現在sdk_demo中獲得app_signatures.apk輸入包名獲得.下載地址:https://github.com/sinaweibosdk/weibo_android_sdk
值得注意的是之高級設置中需要按以下設置(固然若是大神自動可躲避):
申請流程就到這里,以上是注意點.建議大家揣摩1下demo,好處多多.
新建vio微博工程,在微博sdk中導入以下.so文件及weibosdkcore.jar文件
本人不喜歡項目依賴,所以之間拷了過來.大家如果能接受,直接將weibosdk設為依賴.
authInfo = new AuthInfo(this, WeiBoConfig.APP_KEY, WeiBoConfig.REDIRECT_URL, WeiBoConfig.SCOPE);
ssoHandler = new SsoHandler(this, authInfo);
Button btnLogin = (Button) findViewById(R.id.btn_login);
btnLogin.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
ssoHandler.authorize(new AuthListener());
}
});
class AuthListener implements WeiboAuthListener{
private Oauth2AccessToken accessToken;
@Override
public void onCancel() {
Log.d(TAG, "授權取消");
}
@Override
public void onComplete(Bundle arg0) {
accessToken = Oauth2AccessToken.parseAccessToken(arg0);
if (accessToken.isSessionValid()) {// 判斷accessToken是不是有效
Log.d(TAG, "uid = " + accessToken.getUid());
Log.d(TAG, "token = " + accessToken.getToken());
Log.d(TAG, "refreshtoken = " + accessToken.getRefreshToken());
Log.d(TAG, "expirestime = " + accessToken.getExpiresTime());
}else {
Log.d(TAG, "accessToken無效");
// 以下幾種情況,您會收到 Code:
// 1. 當您未在平臺上注冊的利用程序的包名與簽名時;
// 2. 當您注冊的利用程序包名與簽名不正確時;
// 3. 當您在平臺上注冊的包名和簽名與您當前測試的利用的包名和簽名不匹配時。
String code = arg0.getString("code");
code = TextUtils.isEmpty(code) ? "未知code" : code;
Log.d(TAG, "未獲得到有效的accessToken, 毛病碼code = " + code);
}
}
@Override
public void onWeiboException(WeiboException arg0) {
Log.d(TAG, "產生異常 : " + arg0.getMessage());
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// SSO 授權回調
// 重要:發起 SSO 登陸的 Activity 必須重寫 onActivityResult
if (ssoHandler != null) {
ssoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
這是獲得授權最簡單的方式…… 本人比較懶,就直接調用了sdk.勿噴.
ssoHandler.authorize(new AuthListener()); 這類方式默許調用微博客戶端授權,若用戶手機上沒有微博客戶端,則實用web方式授權.