如何使用OAuth2向Mendeley进行身份验证



Iam目前正试图使用Java和库net.oauth向Mendeley进行身份验证。我的目标是从Mendeley检索读者数据,并将其添加到我们的学术文档数据库中。

不幸的是,我目前正在获得401和以下例外:

net.oauth.OAuthProbeException位于net.oauth.client.OAuthClient.ioke(OAuthClient.java:246)位于net.oauth.client.OAuthClient.ioke(OAuthClient.java:143)位于net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:101)位于net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:77)位于net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:116)网址:org.mrdlb.mendeleyCrawler.mendeleyConnection.defaultClient(mendeleyConnection.java:82)网址:org.mrdlb.mendeleyCrawler.mendeleyConnection.getReadership(mendeleyConnection.java:124)网址:org.mrdlb.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.ioke(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请求,但这也不起作用。我更改了Mendeley的URL(因为在文档中它们有不同的URL,但不起作用)。我尝试了不同的例子。我甚至尝试了谷歌的API,但这是一个纯粹的过度杀戮,我甚至不能把一个例子放在一起。我目前猜测我的url可能仍然是错误的,因为我多次找到方法"defaultClient"的确切示例。或者OAuth2发生了变化?

谢谢你的帮助!

您的URL一开始就不正确。

字符串reqUrl="https://www.mendeley.com/oauth/request_token/";

字符串authzUrl="https://api-oauth2.mendeley.com/oauth/authorize/";

字符串accessUrl="https://www.mendeley.com/oauth/access_token/";

以下是来自我们的开发人员门户网站的授权代码流文档,您可能会发现这些文档很有用-http://dev.mendeley.com/reference/topics/authorization_auth_code.html

最新更新