新浪微博 android 開發中 oauth2 認證有兩種 一種是code 一種的sso
code的一種 最常用 sso的需要安裝新浪微博客戶端3.0以上
剛申請的新應用複用以前的代碼就報 permision denied,百思不得其解。新浪微博開發的不向前兼容的麼,後來查看
得知,需要把授權參數從原來的 token 替換爲code
parameters.add("response_type", "code");
問題來了,得到code 如何換取 access_token呢
而開發中code方式 每次都需要授權 很繁瑣,
所以就去官方問:如何授權後 得到Oauth2AccessToken
官方的回答是:請自行從CODE中獲取Oauth2AccessToken
聽到這句話 蛋都碎了一地
找了兩個小時 終於找到 解決方法
通過這個URLhttps://api.weibo.com/oauth2/access_token
POST過去後 返回JSON字符串
JSON字符串中就有
access_token
expires_in
坑爹的是expires_in 是按秒計算的
而oauth2AccessToken.isSessionValid() 是按 毫秒計算的.....
哥又繞了20分鐘纔過去
半成品的API 傷不起啊!!
附上源代碼:
AccessTokenKeeper類 主要用於訪問 保存文件的
- public class AccessTokenKeeper {
- private static final String PREFERENCES_NAME = "com_weibo_sdk_android";
- 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();
- }
- public static void clear(Context context){
- SharedPreferences pref = context.getSharedPreferences(PREFERENCES_NAME, Context.MODE_APPEND);
- Editor editor = pref.edit();
- editor.clear();
- editor.commit();
- }
- 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;
- }
- }
MainActivity 住頁面
- public class MainActivity extends Activity {
- private Weibo weibo;
- private static Oauth2AccessToken oauth2AccessToken;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- weibo = Weibo.getInstance(ConstantS.APP_KEY,ConstantS.REDIRECT_URL,ConstantS.SCOPE);
- MainActivity.oauth2AccessToken = AccessTokenKeeper.readAccessToken(this);
- if (oauth2AccessToken!=null&&oauth2AccessToken.isSessionValid()) {//驗證通過
- //跳向主頁面
- String date = new java.text.SimpleDateFormat("yyyy/MM/dd hh:mm:ss")
- .format(new java.util.Date(MainActivity.oauth2AccessToken
- .getExpiresTime()));
- Toast.makeText(this,"access_token 仍在有效期內,無需再次登錄: \naccess_token:"
- + MainActivity.oauth2AccessToken.getToken() + "\n有效期:" + date,50000).show();
- Intent intent=new Intent(MainActivity.this,LuoBoActivity.class);
- startActivity(intent);
- }
- else {
- weibo.anthorize(MainActivity.this, new authdiloag());
- }
- }
- class authdiloag implements WeiboAuthListener
- {
- @Override
- public void onComplete(Bundle values) {
- String code=values.getString("code");
- // AccessTokenKeeper.keepAccessToken(MainActivity.this, oauth2AccessToken);
- if (code!=null) {
- Toast.makeText(MainActivity.this, "認證code成功"+code, Toast.LENGTH_SHORT).show();
- //android 4.0以後訪問HTTP必須異步處理
- httpThread hThread=new httpThread(code);
- Thread thread=new Thread(hThread);
- thread.start();
- Intent intent=new Intent(MainActivity.this,LuoBoActivity.class);
- startActivity(intent);
- }
- }
- @Override
- public void onCancel() {
- }
- @Override
- public void onError(WeiboDialogError arg0) {
- }
- @Override
- public void onWeiboException(WeiboException arg0) {
- } }
- class httpThread implements Runnable
- {
- String code;
- public httpThread(String code)
- {
- this.code=code;
- }
- @Override
- public void run() {
- try {//key secret 在基本信息裏 回調頁面 在高級信息裏
- HttpPost post=new HttpPost(URI.create("https://api.weibo.com/oauth2/access_token?client_id=自己的APPKEY&client_secret=自己的SECRET&grant_type=authorization_code&redirect_uri=自己的回調頁面&code="+code));
- HttpClient httpClient=new DefaultHttpClient();
- HttpResponse response= httpClient.execute(post);
- if (response.getStatusLine().getStatusCode()==200) {
- String temp=EntityUtils.toString(response.getEntity());
- JSONObject o=new JSONObject(temp);
- String access_token=o.getString("access_token");
- String express_in=o.getString("expires_in");
- //這裏按照 毫秒計算
- long time= Long.parseLong(express_in)*1000+ System.currentTimeMillis();
- if (oauth2AccessToken==null) {
- oauth2AccessToken=new Oauth2AccessToken();
- }
- oauth2AccessToken.setExpiresTime(time);
- oauth2AccessToken.setToken(access_token);
- AccessTokenKeeper.keepAccessToken(MainActivity.this, oauth2AccessToken);
- }
- } catch (ClientProtocolException e) {
- e.printStackTrace();
- } catch (ParseException e) {
- e.printStackTrace();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- }
- }
- 記錄之,幫助後來人~