2016-07-25 53 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

相关问题