生活随笔
收集整理的這篇文章主要介紹了
OAuth认证(完整版)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
拿人人的OAuth認(rèn)證舉例吧。其實(shí)這個(gè)認(rèn)證就是原則上實(shí)現(xiàn)了程序開發(fā)人員和用戶的用戶名密碼的分離,使密碼不會(huì)被第三方獲取。
?? 只有被認(rèn)證后,才能有權(quán)限調(diào)用人人網(wǎng)的接口方法。首先要去人人的開放平臺(tái)去注冊(cè),各種信息都填好后,會(huì)給你一個(gè)API key和一個(gè)Secret key.
? 首先,瀏覽器跳轉(zhuǎn)到人人指定的授權(quán)服務(wù)頁(yè)面,"https://graph.renren.com/oauth/authorize?client_id=XXX&response_type=code&redirect_uri=http://graph.renren.com/oauth/login_success.html";client_id就是你申請(qǐng)的API Key.。redirect_uri就是頁(yè)面的跳轉(zhuǎn),這里使用人人給的默認(rèn)頁(yè)面
webview=(WebView)findViewById(R.id.webview);webview.getSettings().setJavaScriptEnabled(true);//不設(shè)置這個(gè)按鈕不管用webview.getSettings().setBuiltInZoomControls(true);webview.setWebViewClient(new WebViewClient(){@Overridepublic boolean shouldOverrideUrlLoading(WebView view, String url) {// TODO Auto-generated method stubview.loadUrl(url);return true;}//如果希望點(diǎn)擊鏈接由自己處理,而不是新開Android的系統(tǒng)browser中響應(yīng)該鏈接。給WebView添加一個(gè)事件監(jiān)聽對(duì)象(WebViewClient)并重寫其中的一些方法:
shouldOverrideUrlLoading:對(duì)網(wǎng)頁(yè)中超鏈接按鈕的響應(yīng)。當(dāng)按下某個(gè)連接時(shí)WebViewClient會(huì)調(diào)用這個(gè)方法,并傳遞參數(shù)@Overridepublic void onReceivedSslError(WebView view,SslErrorHandler handler, SslError error) {// TODO Auto-generated method stubhandler.proceed();}@Overridepublic void onPageFinished(WebView view, String url) {
//當(dāng)網(wǎng)頁(yè)結(jié)束時(shí)回調(diào)該方法,這時(shí)服務(wù)器會(huì)向url尾部追加參數(shù)code,這個(gè)就是Authorization Code// TODO Auto-generated method stuburl1=webview.getUrl();if(url1!=null){//以下方法就是從url里截取codeString tString;if (url1.contains("code=")){tString = url1.substring(url1.indexOf("code=") + 5, url1.length());MyApplication.getInstance().code=tString;if(MyApplication.getInstance().code!=""){Intent intent=new Intent(AuthorizationActivity.this,WaitActivity.class);startActivity(intent);}}}super.onPageFinished(view, url);}});String url="https://graph.renren.com/oauth/authorize?client_id=0049faf6b6d045c1ssdd333a0f38e3c&response_type=code&redirect_uri=http://graph.renren.com/oauth/login_success.html";webview.loadUrl(url);
第二步就是獲取Authorization Code了。
?? 需要發(fā)送請(qǐng)求(我用的POST)到“https://graph.renren.com/oauth/token”,并傳遞以下參數(shù):
grant_type:固定值“authorization_code”。
code:上一步你獲得的Authorization Code;
client_id:應(yīng)用的API Key;
client_secret:應(yīng)用的Secret Key;
redirect_uri:必須與獲取Authorization Code時(shí)傳遞的“redirect_uri”保持一致。
發(fā)送完請(qǐng)求,服務(wù)器會(huì)返回給你一個(gè)JSON文件。自己解析,就會(huì)獲得access_token,expires_in,refresh_token三個(gè)字符串,建議保存在SQLite或SharedPreference里,可以多次使用,貌似是兩個(gè)月。
核心代碼
????????
url=new URL("https://graph.renren.com/oauth/token?");mHttpURLConnection=(HttpURLConnection) url.openConnection();mHttpURLConnection.setDoInput(true);//設(shè)置Input有效mHttpURLConnection.setDoOutput(true);String grant_type= "grant_type=authorization_code";String code= "&code="+MyApplication.getInstance().code;String client_id= "&client_id=0049faf6b6d0s45c18dbed333a0f38e3c";String client_secret= "&client_secret=d691227sfd46d474bab756de9815c677c";String redirect_uri= "&redirect_uri=http://graph.renren.com/oauth/login_success.html";out=mHttpURLConnection.getOutputStream();out.write((grant_type+code+client_id+client_secret+redirect_uri).getBytes());out.flush();in=mHttpURLConnection.getInputStream();JsonParse parse=new JsonParse();Map<String,String> map=parse.TokenparseJson(in);//自己寫的JSON文件解析的方法,我源代碼里有MyApplication.getInstance().tokenMap=map;SharedPreferences preferences=getSharedPreferences("oauth", MODE_WORLD_WRITEABLE);//三個(gè)參數(shù)可復(fù)用,所以保存起來(lái)SharedPreferences.Editor editor=preferences.edit();editor.putString("access_token", map.get("access_token"));editor.putString("expires_in", map.get("expires_in"));editor.putString("refresh_token", map.get("refresh_token"));editor.commit();
? 接下來(lái)就是要得到Session Key,其實(shí)這步可以省略,貌似以前只有獲得了Session Key才能調(diào)用接口的方法,但是現(xiàn)在直接用access_token就可以了,不過(guò)還是講講怎么獲取吧。
??? POST請(qǐng)求到https://graph.renren.com/renren_api/session_key,寫入?yún)?shù)oauth_token=your access_token
??? 核心代碼:
????????
url = new URL("https://graph.renren.com/renren_api/session_key");HttpURLConnection mHttpURLConnection=(HttpURLConnection)url.openConnection();mHttpURLConnection.setDoInput(true);mHttpURLConnection.setDoOutput(true);String pramar="oauth_token="+MyApplication.getInstance().tokenMap.get("access_token");OutputStream out=mHttpURLConnection.getOutputStream();out.write(pramar.getBytes());out.flush();InputStream in=mHttpURLConnection.getInputStream();byte[] byt=new byte[1024];//不知道為什么,使用BuffedReader循環(huán)讀取總是有問(wèn)題,曲線救國(guó)了int a=in.read(byt);//調(diào)試的時(shí)候可以看看那個(gè)JSON是什么樣子的,在自己寫個(gè)解析方法String tempString=new String(byt, 0, a, "UTF-8");String jsonString="["+tempString+"]";JSONArray jsonArray=new JSONArray(jsonString);JSONObject object=jsonArray.getJSONObject(0);JSONObject renren_token=object.getJSONObject("renren_token");session_key=renren_token.getString("session_key");MyApplication.getInstance().session_key=session_key; 該獲得的都得到了,該調(diào)用API了,但是在這之前還有一項(xiàng)最重要的工作-——簽名,據(jù)人人網(wǎng)稱,這是為了防止你的Sercret key被盜用。以u(píng)sers.getLoggedInUser這個(gè)API為例
String v1="1.0";String api_key1="0049faf6b6d045c18dbqed333a0f38e3c";String format1="JSON";//要把人人網(wǎng)每個(gè)API規(guī)定的必須參數(shù)按照字典升序排列,之后追加Sercret Key在末尾,經(jīng)過(guò)MD5算法,得到的字符串就是你的簽名了String session_key1=MyApplication.getInstance().session_key;public String getLoggedInUser(){GetSignatureM mGetSignatureM=new GetSignatureM();List<String> paramList=new ArrayList<String>();paramList.add("v="+v1);paramList.add("api_key="+api_key1);paramList.add("format="+format1);paramList.add("session_key="+session_key1);paramList.add("method=users.getLoggedInUser");String sig1=mGetSignatureM.getSignature(paramList, "d691227fds46d474bab756de9815c677c");try {String method=URLEncoder.encode("users.getLoggedInUser","UTF-8");String session_key=URLEncoder.encode(session_key1,"UTF-8");String api_key=URLEncoder.encode(api_key1,"UTF-8");String format=URLEncoder.encode(format1,"UTF-8");String v=URLEncoder.encode(v1,"UTF-8");String sig=URLEncoder.encode(sig1,"UTF-8");HttpPost mHttpPost=new HttpPost();String url="http://api.renren.com/restserver.do";String parmar="method="+method+"&session_key="+session_key+"&api_key="+api_key+"&format="+format+"&v="+v+"&sig="+sig;InputStream in=mHttpPost.doPost(url, parmar);byte[] b=new byte[1024];int a=in.read(b);String line="["+new String(b, 0, a,"UTF-8")+"]";return line; MD5算法
Collections.sort(paramList);StringBuffer buffer = new StringBuffer();for (String param : paramList) {buffer.append(param); //將參數(shù)鍵值對(duì),以字典序升序排列后,拼接在一起}buffer.append(secret); //符串末尾追加上應(yīng)用的Secret Keytry { //下面是將拼好的字符串轉(zhuǎn)成MD5值,然后返回java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");StringBuffer result = new StringBuffer();try {for (byte b : md.digest(buffer.toString().getBytes("UTF-8"))) {result.append(Integer.toHexString((b & 0xf0) >>> 4));result.append(Integer.toHexString(b & 0x0f));}} catch (UnsupportedEncodingException e) {for (byte b : md.digest(buffer.toString().getBytes())) {result.append(Integer.toHexString((b & 0xf0) >>> 4));result.append(Integer.toHexString(b & 0x0f));}}return result.toString(); 這樣就能調(diào)用API了
?
轉(zhuǎn)自http://eoeandroid.com/thread-114876-1-1.html
轉(zhuǎn)載于:https://www.cnblogs.com/neilyo/archive/2011/11/15/2249243.html
總結(jié)
以上是生活随笔為你收集整理的OAuth认证(完整版)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。