2016-07-25 59 views
1

Iam當前正在嘗試使用Java和庫net.oauth與Mendeley進行身份驗證。我的目標是從Mendeley檢索讀者數據,將其添加到我們的學術文檔數據庫中。如何使用OAuth2向Mendeley進行身份驗證

不幸的是我目前得到一個401及以下異常:在net.oauth

net.oauth.OAuthProblemException 在net.oauth.client.OAuthClient.invoke(OAuthClient.java:246) .net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:77) (位於net.oauth.client.OAuthClient.getRequestToken at.auth.client.OAuthClient.getRequestToken(OAuthClient.java:116) at org.mrdlib.mendeleyCrawler.mendeleyConnection.defaultClien (mendeleyConnection.java:82) at org.mrdlib.mendeleyCrawler.mendeleyConnection.getReadership(mendeleyConnection.java:124) at org.mrdlib.mendeleyCrawler.mendeleyConnection.main(mendeleyConnection.java:190) at sun.reflect。 NativeMethodAccessorImpl.invoke0(本機方法) 在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 在java.lang.reflect.Method.invoke (Method.java:497) 在org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)

我使用以下代碼:

public class mendeleyConnection { 

private OAuthAccessor client; 
private String access_token; 
private String request_token; 
private DBConnection con; 

public mendeleyConnection() { 
    con = new DBConnection(); 
} 

public String convertToAccessToken(String request_token) { 
    ArrayList<Map.Entry<String, String>> params = new ArrayList<Map.Entry<String, String>>(); 
    OAuthClient oclient = new OAuthClient(new HttpClient4()); 
    OAuthAccessor accessor = client; 
    params.add(new OAuth.Parameter("oauth_token", request_token)); 
    try { 
     OAuthMessage omessage = oclient.invoke(accessor, "POST", accessor.consumer.serviceProvider.accessTokenURL, 
       params); 
     return omessage.getParameter("oauth_token"); 
    } catch (OAuthProblemException e) { 
     e.printStackTrace(); 
     return ""; 
    } catch (Exception ioe) { 
     ioe.printStackTrace(); 
     return ""; 
    } 
} 

public OAuthAccessor defaultClient() { 
    String callbackUrl = "some fallback url"; 
    String consumerKey = "the id of the mendeley application"; 
    String consumerSecret = "a generated secret"; 
    String reqUrl = "https://www.mendeley.com/oauth/request_token/"; 
    String authzUrl = "https://api-oauth2.mendeley.com/oauth/authorize/"; 
    String accessUrl = "https://www.mendeley.com/oauth/access_token/"; 
    OAuthServiceProvider provider = new OAuthServiceProvider(reqUrl, authzUrl, accessUrl); 
    OAuthConsumer consumer = new OAuthConsumer(callbackUrl, consumerKey, consumerSecret, provider); 
    OAuthAccessor accessor = new OAuthAccessor(consumer); 

    OAuthClient oaclient = new OAuthClient(new HttpClient4()); 

    try { 
     oaclient.getRequestToken(accessor); 
     request_token = accessor.requestToken; 
    } catch (OAuthProblemException e) { 
     e.printStackTrace(); 
     System.out.println(e.getHttpStatusCode()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return accessor; 
} 

public HashMap<String, Readership> getReadership() { 
    HashMap<String, Readership> map = new HashMap<String, Readership>(); 
    List<String> documentTitles = new ArrayList<>(); 
    Readership readership = null; 
    String mendeleyId = null; 
    int score = 0; 
    HttpPost httppost = new HttpPost(); 
    URL url = null; 
    String nullFragment = null; 
    JSONObject jsonObject = null; 

    documentTitles = con.getAllDocumentTitles(); 

    for (int i = 0; i < documentTitles.size(); i++) { 
     String current = documentTitles.get(i); 

     HttpClient httpclient = HttpClientBuilder.create().build(); 
     String urlString = "https://api.mendeley.com/catalog?title=" + current; 

     client = defaultClient(); 
     access_token = convertToAccessToken(client.requestToken); 

     try { 
      url = new URL(urlString); 
      URI uri = new URI(url.getProtocol(), url.getHost(), url.getPath(), url.getQuery(), nullFragment); 
      httppost = new HttpPost(uri); 
      httppost.addHeader("Authorization", "Bearer " + client.requestToken); 


      List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>(2); 
      nameValuePairs.add(new BasicNameValuePair("action", "getjson")); 

      httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs)); 
      HttpResponse response = httpclient.execute(httppost); 
      String data = EntityUtils.toString(response.getEntity()); 

      jsonObject = (JSONObject) JSONValue.parse(data); 
      mendeleyId = (String) jsonObject.get("id"); 
      score = (Integer) jsonObject.get("score"); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     [...] 
    } 
    return map; 
} 

public static void main(String[] args) { 
    mendeleyConnection mcon = new mendeleyConnection(); 
    mcon.getReadership(); 

} 

} 

唯一的例外是在

oaclient.getRequestToken(存取器)拋出;

由於我沒有Http請求和身份驗證主題的經驗,我將不勝感激一些幫助。我已經閱讀了Mendeley的指南以及我可以在互聯網上找到的所有例子。我也使用了Get請求,但這也沒有奏效。我改變了門德利的URL(因爲在文檔中他們有不同的東西,這是行不通的)。我嘗試了不同的例子。我甚至嘗試了谷歌的API,但這是一個純粹的Overkill,我甚至不能把一個例子放在一起。我目前猜測,我的網址可能仍然是錯誤的,因爲我幾次發現方法「defaultClient」的確切例子。或者,也許OAuth2發生了變化?

感謝您的幫助!

回答

0

你的網址對於開始來說不正確。

String reqUrl =「https://www.mendeley.com/oauth/request_token/」;

String authzUrl =「https://api-oauth2.mendeley.com/oauth/authorize/」;

String accessUrl =「https://www.mendeley.com/oauth/access_token/」;

這是從我們的開發者門戶網站的授權碼流,你可能會發現有用的文檔 - http://dev.mendeley.com/reference/topics/authorization_auth_code.html

+0

是啊,我是這麼認爲已經建議。但是工作的是什麼?我也嘗試過String reqUrl =「https://www.mendeley。com/oauth/token /「; String authzUrl =」https://api.mendeley.com/oauth/authorize/「; String accessUrl =」https://www.mendeley.com/oauth/token/「;和其他 – Millah

+0

授權URL = https://api.mendeley.com/oauth/authorize,令牌URL是https://api.mendeley.com/oauth/token – MendeleyStack

相關問題