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;
}
}
运行效果: