Как пройти аутентификацию в Mendeley с помощью OAuth2

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

К сожалению, в настоящее время я получаю 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) по адресу net.oauth.client.OAuthClient.getRequestToken(OAuthClient.java:116) по адресу org.mrdlib.mendeleyCrawler.mendeleyConnection.defaultClient (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.refle ct.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, но это тоже не сработало. Сменил урлы от Mendeley (поскольку в документации они разные, которые не работают). Пробовал разные примеры. Я даже попробовал API от Google, но это был чистый Overkill, и я даже не смог собрать пример. В настоящее время я предполагаю, что мой URL-адрес все еще может быть неправильным, поскольку я несколько раз находил точный пример метода «defaultClient». Или, может быть, было изменение с OAuth2?

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


person Millah    schedule 25.07.2016    source источник


Ответы (1)


Ваши URL-адреса неверны для начала.

String 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

person MendeleyStack    schedule 02.08.2016
comment
Да, это то, что я уже предложил. Но какие есть рабочие? Я также пробовал String reqUrl = mendeley.com/oauth/token; Строка authzUrl = api.mendeley.com/oauth/authorize; Строка accessUrl = mendeley.com/oauth/token; и другие - person Millah; 10.08.2016
comment
URL-адрес авторизации = api.mendeley.com/oauth/authorize, а URL-адрес токена api.mendeley.com/oauth/token - person MendeleyStack; 10.08.2016