四大微博OAuth認證

據說這兩天騰訊的服務器出了問題,認證的時候報這樣的錯:

 

  1. Java 代碼複製內容到剪貼板  
  2.       
  3. oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: Not trusted server certificate        
  4. Caused by: javax.net.ssl.SSLPeerUnverifiedException: No peer certificate        
  5. oauth.signpost.exception.OAuthCommunicationException: Communication with the service provider failed: Nopeer certificate    

這是因爲Https認證被截獲導致,Client認爲安全失效,很久之前就出現了這個問題了,那時候在WebView上加上下面的代碼就可以解決了

 

  1. Java 代碼複製內容到剪貼板  
  2.       
  3. public void onReceivedSslError(WebView view, SslErrorHandler handler, SslError error) {           
  4.      handler.proceed();        
  5. }      

沒想到又出現這個問題,於是一翻研究,在stackoverflow.com上找到答案,寫了一個自定義類繼承SSLSocketFactory,

 

  1. Java 代碼複製內容到剪貼板  
  2.       
  3. public class SSLSocketFactoryEx extends SSLSocketFactory {        
  4.         
  5.     SSLContext sslContext = SSLContext.getInstance("TLS");        
  6.         
  7.     public SSLSocketFactoryEx(KeyStore truststore)        
  8.             throws NoSuchAlgorithmException, KeyManagementException,        
  9.             KeyStoreException, UnrecoverableKeyException {        
  10.         super(truststore);        
  11.         
  12.         TrustManager tm = new X509TrustManager() {        
  13.         
  14.             public java.security.cert.X509Certificate[] getAcceptedIssuers() {        
  15.                 return null;        
  16.             }        
  17.         
  18.             @Override        
  19.             public void checkClientTrusted(        
  20.                     java.security.cert.X509Certificate[] chain, String authType)        
  21.                     throws java.security.cert.CertificateException {        
  22.         
  23.             }        
  24.         
  25.             @Override        
  26.             public void checkServerTrusted(        
  27.                     java.security.cert.X509Certificate[] chain, String authType)        
  28.                     throws java.security.cert.CertificateException {        
  29.         
  30.             }        
  31.         };        
  32.         
  33.         sslContext.init(nullnew TrustManager[] { tm }, null);        
  34.     }        
  35.         
  36.     @Override        
  37.     public Socket createSocket(Socket socket, String host, int port,        
  38.             boolean autoClose) throws IOException, UnknownHostException {        
  39.         return sslContext.getSocketFactory().createSocket(socket, host, port,        
  40.                 autoClose);        
  41.     }        
  42.         
  43.     @Override        
  44.     public Socket createSocket() throws IOException {        
  45.         return sslContext.getSocketFactory().createSocket();        
  46.     }        
  47. }    

調用方法,只要用認證返回的HttpCilent即可。代碼:

 

  1. Java 代碼複製內容到剪貼板  
  2.       
  3. public HttpClient getNewHttpClient() {        
  4.         try {        
  5.             KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());        
  6.             trustStore.load(nullnull);        
  7.         
  8.             SSLSocketFactory sf = new SSLSocketFactoryEx(trustStore);        
  9.             sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);        
  10.         
  11.             HttpParams params = new BasicHttpParams();        
  12.             HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);        
  13.             HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);        
  14.         
  15.             SchemeRegistry registry = new SchemeRegistry();        
  16.             registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));        
  17.             registry.register(new Scheme("https", sf, 443));        
  18.         
  19.             ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);        
  20.         
  21.             return new DefaultHttpClient(ccm, params);        
  22.         } catch (Exception e) {        
  23.             return new DefaultHttpClient();        
  24.         }        
  25.     }    

這樣就解決了問題,有網友說把騰訊認證的地址https去掉改成http,那是不可取的做法。

我已經把代碼集成到signpost中,如果有需要的同學可自行下載,有不明白或者不好的地方給我評論留言。

 

源碼下載:

 

2011-12-11日更新了oauth-signpost-1211.jar包,把原來打jar包時也一起打的commons-codec.jar去掉了。

 

下載文件 (已下載 176 次)
這個文件只能在登入之後下載。請先 註冊登入

 

 

好吧,把源碼也傳上來了,供大家下載:

 

下載文件 (已下載 1020 次)
這個文件只能在登入之後下載。請先註冊登入

 

不過還是推薦使用OAuth2.0,方便很多。而且新浪也不推薦使用OAuth1.0了。

 
 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章