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
4.注册应用包名和签名
在http://open.weibo.com/页面点击管理中心-》我的应用-》应用信息-》基本信息-》编辑,看到如下
填写好包名,并且下载网站提供的签名工具apk,根据你应用的包名生成MD5值,然后填写到网页上,这个步骤很重要,如果不填写的话会获取不到token
5.编写代码
1).初始化Weibo对象
在请求用户授权的时候需要以HTTP get/post请求向服务器传APPKEY和requestUrl和scope权限,这个通信步骤JAR包中的相应方法已经帮我们封装好了,开发者只需要向方法中传入在网页上创建app后生成的APPKEY和requestUrl
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>
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; } }运行效果: