新浪微博 android oAuth2.0认证过程

Oauth的大致授权流程如下图,Client指自己开发的app,Resource Owner指用户,Authorization Server是新浪的授权服务器,Resource Server是API服务器。

新浪微博 android oAuth2.0认证过程_第1张图片

应用先进入授权页面,请求用户进行授权,用户同意后,获得授权服务器返回的Access Token,Access Token是用来表示用户身份的 token。调用接口时将此token传给API服务器,获取内容。

认证授权过程:

1.新建工程,导入JAR包。

将下载的weibo_sdk.jar放到工程的 libs 目录 下

2.增加权限

AndroidManifest.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" />

3.官网上创建应用,获取APPKEY和RequestUrl

APPKEY,requestUrl:在 http://open.weibo.com/页面点击管理中心-》我的应用-》创建应用。填写相应信息完毕后点击应用信息-》基本信息,可以查看到APPKEY。在"高级信息"中,可以设置授权回调页RequestUrl,这里RequestUrl可以使用OAuth2.0客户端默认回调页 https://api.weibo.com/oauth2/default.html。

4.注册应用包名和签名

在http://open.weibo.com/页面点击管理中心-》我的应用-》应用信息-》基本信息-》编辑,看到如下


填写好包名,并且下载网站提供的签名工具apk,根据你应用的包名生成MD5值,然后填写到网页上,这个步骤很重要,如果不填写的话会获取不到token

新浪微博 android oAuth2.0认证过程_第2张图片

5.编写代码

1).初始化Weibo对象

在请求用户授权的时候需要以HTTP get/post请求向服务器传APPKEY和requestUrl和scope权限,这个通信步骤JAR包中的相应方法已经帮我们封装好了,开发者只需要向方法中传入在网页上创建app后生成的APPKEY和requestUrl

Scope参数:通过scope,微博平台开放一定的接口调用权限给开发者的引用。这个参数不是必需的,可以传null。
Weibo weibo = Weibo.getInstance(Constant.APP_KEY, Constant.REDIRECT_URL, null);

2).实现 WeiboAuthListener接口

实现WeiboAuthListener接口,在onComplete回调中,获得access token和过期时间,再根据这2个值获取Oauth2AccessToken对象,把他们保存在sharedpreference中。

		@Override
		public void onComplete(Bundle values) {
		
			 //access token
			 String accessToken = values.getString("access_token");
			 //过期时间
	         String expires_in = values.getString("expires_in");
	         
	         Log.v("test", "成功! token== " + accessToken   + ",expires_in:" + expires_in);
	         
	         Oauth2AccessToken token = new Oauth2AccessToken(accessToken, expires_in);
	         AccessTokenKeeper.keepAccessToken(MainActivity.this, token);
	         
		}

		@Override
		public void onError(WeiboDialogError arg0) {
			
		}

		@Override
		public void onWeiboException(WeiboException arg0) {
			
		}
	}
3).用Weibo实例进行验证,参数是activitiy和WeiboAuthListener的实例

weibo.authorize(MainActivity.this, new WbAuthListener());

完整的代码如下:

布局:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <Button
        android:id="@+id/grant"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="oAuth" />

</RelativeLayout>

MainActivity:

public class MainActivity extends Activity {

	private Button grant;
	private Weibo weibo;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		grant = (Button) findViewById(R.id.grant);
		grant.setOnClickListener(new GrantListener());
		weibo = Weibo.getInstance(Constant.APP_KEY, Constant.REDIRECT_URL, null);
	}
	
	private class GrantListener implements OnClickListener {

		@Override
		public void onClick(View v) {
			weibo.anthorize(MainActivity.this, new WbAuthListener());
		}
	}

	private class WbAuthListener implements WeiboAuthListener
	{

		@Override
		public void onCancel() {
			
		}

		@Override
		public void onComplete(Bundle values) {
		
			 //access token
			 String accessToken = values.getString("access_token");
			 //过期时间
	         String expires_in = values.getString("expires_in");
	         
	         Log.v("test", "成功! token== " + accessToken   + ",expires_in:" + expires_in);
	         
	         Oauth2AccessToken token = new Oauth2AccessToken(accessToken, expires_in);
	         AccessTokenKeeper.keepAccessToken(MainActivity.this, token);
	         
		}

		@Override
		public void onError(WeiboDialogError arg0) {
			
		}

		@Override
		public void onWeiboException(WeiboException arg0) {
			
		}
	}
	
}
AccessTokenKeeper.java

public class AccessTokenKeeper {
	private static final String PREFERENCES_NAME = "com_weibo_sdk_android";
	/**
	 * 保存accesstoken到SharedPreferences
	 */
	public static void keepAccessToken(Context context, Oauth2AccessToken token) {
		SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
		Editor editor = pref.edit();
		editor.putString("token", token.getToken());
		editor.putLong("expiresTime", token.getExpiresTime());
		editor.commit();
	}
	/**
	 * 清空sharepreference
	 * @param context
	 */
	public static void clear(Context context){
	    SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
	    Editor editor = pref.edit();
	    editor.clear();
	    editor.commit();
	}

	/**
	 * 从SharedPreferences读取accessstoken
	 * @param context
	 * @return Oauth2AccessToken
	 */
	public static Oauth2AccessToken readAccessToken(Context context){
		Oauth2AccessToken token = new Oauth2AccessToken();
		SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
		token.setToken(pref.getString("token", ""));
		token.setExpiresTime(pref.getLong("expiresTime", 0));
		return token;
	}
}
运行效果:

新浪微博 android oAuth2.0认证过程_第3张图片 



你可能感兴趣的:(新浪微博 android oAuth2.0认证过程)