OAuth2認證介紹,oauth2認證
1.OAuth2認證簡介
(1)OAuth2認證原理圖:
2)簡介:OAuth2(開放授權)是一個開放標準,允許使用者讓第三方應用訪問該使用者在某一網站上儲存的私密的資源(如照片,視頻,連絡人清單),而無需將使用者名稱和密碼提供給第三方應用。
(3)為什麼使用OAuth2認證:防止第三方應用獲得使用者名稱和密碼,在網頁中完成認證。另外
使用https請求,防止抓包泄密。即使抓包獲得了使用者和密碼,也是經過加密的,很難破解。
通過OAuth2認證最終可以獲得token,然後通過token可以調用第三方平台提供的介面,實現需要的功能。
但若token儲存在本地的話,需要加密,防止被竊取,泄露使用者資訊。
2.OAuth2認證的實際應用
獲得新浪微博授權認證的流程:
(1)在新浪開放平台上建立應用,獲得appkey、appsecret和回調地址
(2)在測試機上安裝MD5簽名產生工具 產生md5密鑰 或在eclipse preference->build中查看當前keystore檔案的md5值
並在開放平台的應用中填寫
(3)如果應用未審核通過, 需要在開放平台測試資訊裡添加測試帳號, 只有測試帳號才能成功提供者
新浪微博OAuth2認證 實現發微博功能代碼:
主類:
public class MainActivity extends Activity { private int SEND_WEIBO=1; /** 注意:SsoHandler 僅當 SDK 支援 SSO 時有效 */ private SsoHandler mSsoHandler; /** 微博 Web 授權類,提供登陸等功能 */ private WeiboAuth mWeiboAuth; /** 封裝了 "access_token","expires_in","refresh_token",並提供了他們的管理功能 */ private Oauth2AccessToken mAccessToken; private HttpUtils httpUtils=new HttpUtils(); private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { if(msg.what==SEND_WEIBO) { RequestCallBack<String> callBack=new RequestCallBack<String>() { @Override public void onSuccess(ResponseInfo<String> responseInfo) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "發微博成功", Toast.LENGTH_SHORT).show(); } @Override public void onFailure(HttpException error, String msg) { Toast.makeText(MainActivity.this, "發微博失敗", Toast.LENGTH_SHORT).show(); } }; try { InputStream is=getAssets().open("a.jpg"); File file=new File(Environment.getExternalStorageDirectory()+"/a.jpg"); if(!file.exists()) { file.createNewFile(); } FileOutputStream out=new FileOutputStream(file); byte []buffer=new byte[1024]; int len=0; while( (len=is.read(buffer)) !=-1) { out.write(buffer, 0, len); } out.close(); is.close(); if(file!=null && file.length()>0) { RequestParams params=new RequestParams(); params.addBodyParameter("status", "測試案例"); params.addBodyParameter("source", "3680529134"); params.addBodyParameter("access_token", mAccessToken.getToken()); params.addBodyParameter("pic", file); httpUtils.configTimeout(3000); httpUtils.send(HttpMethod.POST, "https://upload.api.weibo.com/2/statuses/upload.json", params, callBack); } } catch (IOException e) { e.printStackTrace(); }// httpUtils.configTimeout(3000); //httpUtils.send(HttpMethod.POST, "https://upload.api.weibo.com/2/statuses/upload.json", params, callBack); } }; }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 建立微博執行個體 mWeiboAuth = new WeiboAuth(this, Constants.APP_KEY, Constants.REDIRECT_URL, Constants.SCOPE); Button btnLogin = (Button) findViewById(R.id.btn_sso); btnLogin.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { mSsoHandler = new SsoHandler(MainActivity.this, mWeiboAuth); mSsoHandler.authorize(new AuthListener()); } }); } /** * 當 SSO 授權 Activity 退出時,該函數被調用。 * * @see {@link Activity#onActivityResult} */ @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // SSO 授權回調 // 重要:發起 SSO 登陸的 Activity 必須重寫 onActivityResult if (mSsoHandler != null) { mSsoHandler.authorizeCallBack(requestCode, resultCode, data); Toast.makeText(this, "認證 成功"+mAccessToken.getToken(), Toast.LENGTH_SHORT).show(); handler.sendEmptyMessage(SEND_WEIBO); } } /** * 微博認證授權回調類。 1. SSO 授權時,需要在 {@link #onActivityResult} 中調用 * {@link SsoHandler#authorizeCallBack} 後, 該回調才會被執行。 2. 非 SSO * 授權時,當授權結束後,該回調就會被執行。 當授權成功後,請儲存該 access_token、expires_in、uid 等資訊到 * SharedPreferences 中。 */ class AuthListener implements WeiboAuthListener { @Override public void onComplete(Bundle values) { // 從 Bundle 中解析 Token mAccessToken = Oauth2AccessToken.parseAccessToken(values); if (mAccessToken.isSessionValid()) { // 顯示 Token Log.d("Test", "token=" + mAccessToken.getToken()); } } @Override public void onCancel() { Toast.makeText(MainActivity.this, "認證取消", Toast.LENGTH_LONG).show(); } @Override public void onWeiboException(WeiboException e) { Toast.makeText(MainActivity.this, "Auth exception : " + e.getMessage(), Toast.LENGTH_LONG) .show(); } }}
項目:
http://download.csdn.net/detail/aehaojiu/8609659
需要用到xUtils開源項目:
http://download.csdn.net/detail/aehaojiu/8610323