2016-07-25 6 views
1

Iam в настоящее время пытается аутентифицироваться с помощью Mendeley с использованием Java и библиотеки net.oauth. Моя цель - получить данные читателей от Менделей, чтобы добавить их в нашу базу данных академических документов.Как аутентифицироваться в Mendeley с использованием OAuth2

Unfortunatly Сейчас я получаю 401 и следующее исключение:

net.oauth.OAuthProblemException на net.oauth.client.OAuthClient.invoke (OAuthClient.java:246) в net.oauth .client.OAuthClient.invoke (OAuthClient.java:143) на net.oauth.client.OAuthClient.getRequestToken (OAuthClient.java:101) на net.oauth.client.OAuthClient.getRequestToken (OAuthClient.java:77) at net.oauth.client.OAuthClient.getRequestToken (OAuthClient.java:116) at org.mrdlib.mendeleyCrawler.mendeleyConnection.defaultClien т (mendeleyConnection.java:82) на org.mrdlib.mendeleyCrawler.mendeleyConnection.getReadership (mendeleyConnection.java:124) на org.mrdlib.mendeleyCrawler.mendeleyConnection.main (mendeleyConnection.java:190) на 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-запросов и аутентификации, я был бы признателен за помощь. Я читал путеводители от Менделей и все примеры, которые я мог найти в Интернете. Я также использовал запрос Get, но это тоже не сработало. Я изменил URL-адреса от Mendeley (поскольку в документации у них разные, которые не работают). Я попробовал разные примеры. Я даже попробовал API от Google, но это был чистый Overkill, и я даже не мог собрать пример. В настоящее время я предполагаю, что мой URL-адрес может быть неправильным, так как я несколько раз нашел пример метода «defaultClient». Или, может быть, произошли изменения с OAuth2?

Спасибо за помощь!

ответ

0

У вас неправильные URL-адреса для начала.

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