gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:23:51 25 4
gpt4 key购买 nike

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

不幸的是,我目前收到 401 和以下异常:

net.oauth.OAuthProblemException at net.oauth.client.OAuthClient.invoke(OAuthClient.java:246) at net.oauth.client.OAuthClient.invoke(OAuthClient.java:143) at net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:101) at net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:77) at net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:116) at org.mrdlib.mendeleyCrawler.mendeleyConnection.defaultClient(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(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at 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(accessor);

由于我在 Http 请求和身份验证主题方面没有经验,因此我希望获得一些帮助。我已阅读 Mendeley 的指南以及我在互联网上可以找到的所有示例。我也使用了 Get 请求,但这也不起作用。我更改了 Mendeley 的网址(因为在文档中它们有不同的网址,但不起作用)。我尝试了不同的例子。我什至尝试了 Google 的 API,但这纯粹是过度杀伤力,我什至无法将示例放在一起。我目前猜测我的网址可能仍然是错误的,因为我多次找到了方法“defaultClient”的确切示例。或者也许 OAuth2 发生了变化?

感谢您的帮助!

最佳答案

您的网址一开始就不正确。

字符串 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

关于java - 如何使用 OAuth2 向 Mendeley 进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38570101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com