2016-07-25 5 views
1

Iam versucht derzeit, mit Mendeley mit Java und der Bibliothek net.oauth zu authentifizieren. Mein Ziel ist es, die Leserschaftsdaten von Mendeley abzurufen und sie in unsere Datenbank akademischer Dokumente aufzunehmen.Wie authentifiziere ich Mendeley mit OAuth2

Unfortunatly Ich bin derzeit immer eine 401 und die folgende Ausnahme:

net.oauth.OAuthProblemException bei net.oauth.client.OAuthClient.invoke (OAuthClient.java:246) bei net.oauth .client.OAuthClient.invoke (OAuthClient.java:143) bei net.oauth.client.OAuthClient.getRequestToken (OAuthClient.java:101) bei net.oauth.client.OAuthClient.getRequestToken (OAuthClient.java:77) at net.oauth.client.OAuthClient.getRequestToken (OAuthClient.java:116) bei org.mrdlib.mendeleyCrawler.mendeleyConnection.defaultClien t (mendeleyConnection.java:82) bei org.mrdlib.mendeleyCrawler.mendeleyConnection.getReadership (mendeleyConnection.java:124) bei org.mrdlib.mendeleyCrawler.mendeleyConnection.main (mendeleyConnection.java:190) bei sun.reflect. NativeMethodAccessorImpl.invoke0 (native Methode) bei sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) bei sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) bei java.lang.reflect.Method.invoke (Method.java:497) bei org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main (JarRsrcLoader.java:58)

ich der folgende Code:

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(); 

} 

} 

Die Ausnahme ist bei

oaclient.getRequestToken (Accessor) geworfen;

Da ich keine Erfahrung mit dem Thema HTTP-Anfragen und Authentifizierung habe, würde ich mich über Hilfe freuen. Ich habe die Anleitungen von Mendeley gelesen und alle Beispiele, die ich im Internet finden konnte. Ich habe auch eine Get-Anfrage verwendet, aber das hat auch nicht funktioniert. Ich habe die URLs von Mendeley geändert (da sie in der Dokumentation verschiedene haben, die nicht funktionieren). Ich habe verschiedene Beispiele ausprobiert. Ich habe sogar die API von Google ausprobiert, aber das war ein reines Overkill und ich konnte nicht einmal ein Beispiel zusammenstellen. Ich vermute derzeit, dass meine URL möglicherweise immer noch falsch ist, da ich das Beispiel der Methode "defaultClient" mehrmals genau gefunden habe. Oder gab es eine Änderung bei OAuth2?

Danke für die Hilfe!

Antwort

0

Ihre URLs sind für den Anfang falsch.

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

Zeichenfolge authzUrl = "https://api-oauth2.mendeley.com/oauth/authorize/";

String accessUrl = "https://www.mendeley.com/oauth/access_token/"; Hier

ist die Dokumentation über den Berechtigungscode-Flow aus unserem Entwicklerportal, das Sie nützlich sein könnten - http://dev.mendeley.com/reference/topics/authorization_auth_code.html

+0

Ja, das ist, was ich bereits vorgeschlagen. Aber was sind die arbeitenden? Ich habe auch versucht, String reqUrl = "https: //www.mendeley.com/oauth/token/"; Zeichenfolge authzUrl =" https://api.mendeley.com/oauth/authorize/ "; Zeichenfolge accessUrl =" https://www.mendeley.com/oauth/token/ "; und andere – Millah

+0

Autorisieren URL = https://api.mendeley.com/oauth/authorize und die Token-URL ist https://api.mendeley.com/oauth/token – MendeleyStack

Verwandte Themen