您的位置:首页 > 移动开发 > Android开发

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

2013-11-10 23:46 661 查看
Oauth的大致授权流程如下图,Client指自己开发的app,Resource Owner指用户,Authorization Server是新浪的授权服务器,Resource Server是API服务器。



应用先进入授权页面,请求用户进行授权,用户同意后,获得授权服务器返回的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



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;
}
}

运行效果:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: