Использование библиотеки JOAuth для публикации вакансий в LinkedIn

Это продолжение моего вопроса о реализации LinkedIn API публикации вакансий на Java. Я новичок в этой аутентификации на основе OAuth для публикации вакансий, и я также учусь в этом процессе. Пожалуйста, потерпите меня, если мои вопросы очень простые/наивные.

Я пытаюсь использовать библиотеку JOAuth для аутентификации OAuth и публикации вакансий в LinkedIn. . Я использую вызовы OAuth2. У меня есть следующие вопросы с библиотекой JOAuth:

  1. В примере, показанном по ссылке JOAuth, как мне получить токен запроса для LinkedIn? Я не нахожу никакого заявления для запроса токена запроса. Но я мог видеть consumer.generateRequestAuthorizationUrl(ResponseType.CODE, redirectUri, null, (String[])null));
  2. Если я хочу использовать перенаправление обратного вызова на основе oob, что мне нужно передать/установить в redirectUri?
  3. Если все прошло успешно и у меня есть токен доступа, как мне, наконец, отправить/отправить XML-данные моего задания по адресу http://api.linkedin.com/v1/jobs?

person Gnanam    schedule 14.06.2011    source источник
comment
К сожалению, старый joauth_1Authorization1.jar имел недостатки при создании заголовка Authorization для OAuth 1. Новый joauth_1_3_1.jar содержит исправление и следует строгой реализации RFC 5849.   -  person Buhake Sindi    schedule 02.03.2012


Ответы (2)


Вы запутались. LinkedIn использует протокол OAuth 1, а не протоколы OAuth 2. Вот как вы могли бы выполнить авторизацию Oauth 1 в/с LinkedIn.

Если вы создаете веб-приложение, в папке WEB-INF создайте файл oauth-config.xml и настройте его примерно так:

<?xml version="1.0" encoding="UTF-8"?>
<oauth-config>
    <!-- LinkedIn OAuth Config -->
        <oauth name="linkedIn" version="1">
                <consumer key="API_KEY" secret="API_SECRET" />
                <provider requestTokenUrl="https://api.linkedin.com/uas/oauth/requestToken" authorizationUrl="https://api.linkedin.com/uas/oauth/authorize" accessTokenUrl="https://api.linkedin.com/uas/oauth/accessToken" />
        </oauth>

        <service path="/authorize_ready" class="com.neurologic.example.LinkedInOAuthService" oauth="linkedIn">
                <success path="/start.htm" />
        </service>
</oauth-config>

LinkedIn использует OAuth версии 1 (отсюда и версия).

Под WEB-INF\web.xml добавьте следующее:

<servlet>
    <description>An OAuth Servlet Controller</description>
    <display-name>OAuthServlet</display-name>
    <servlet-name>OAuthServlet</servlet-name>
    <servlet-class>com.neurologic.oauth.servlet.OAuthServlet</servlet-class>
    <init-param>
        <param-name>config</param-name>
        <param-value>/WEB-INF/oauth-config.xml</param-value>
    </init-param>
    <load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>OAuthServlet</servlet-name>
    <url-pattern>/oauth/*</url-pattern>
</servlet-mapping>

Теперь нам нужно создать службу, которая будет получать авторизованный токен от Linked In.

package com.neurologic.example;

import javax.servlet.http.HttpServletRequest;

import net.oauth.signature.OAuthSignature;
import net.oauth.signature.impl.OAuthHmacSha1Signature;
import net.oauth.token.v1.AccessToken;
import net.oauth.token.v1.RequestToken;

import com.neurologic.oauth.service.impl.OAuth1Service;

/**
 * @author Buhake Sindi
 * @since 31 May 2011
 *
 */
public class LinkedInOAuthService extends OAuth1Service {

    public static final String LINKED_IN_REQUEST_TOKEN_SESSION = "LINKED_IN_REQUEST_TOKEN_SESSION";
    public static final String LINKED_IN_ACCESS_TOKEN_SESSION = "LINKED_IN_ACCESS_TOKEN_SESSION";

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getOAuthSignature()
     */
    @Override
    protected OAuthSignature getOAuthSignature() {
        // TODO Auto-generated method stub
        return new OAuthHmacSha1Signature();
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getRealm()
     */
    @Override
    protected String getRealm() {
        // TODO Auto-generated method stub
        return null;
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.impl.OAuth1Service#getRequestToken(javax.servlet.http.HttpServletRequest)
     */
    @Override
    protected RequestToken getRequestToken(HttpServletRequest request) {
        // TODO Auto-generated method stub
        return (RequestToken) request.getSession().getAttribute(LINKED_IN_REQUEST_TOKEN_SESSION);
    }

    /* (non-Javadoc)
     * @see com.neurologic.oauth.service.OAuthService#saveAccessToken(javax.servlet.http.HttpServletRequest, java.lang.Object)
     */
    @Override
    public void saveAccessToken(HttpServletRequest request, AccessToken accessToken) {
        // TODO Auto-generated method stub
        request.getSession().setAttribute(LINKED_IN_ACCESS_TOKEN_SESSION, accessToken);
    }
}

Теперь используйте следующий пример:

package com.neurologic.example;

import net.oauth.consumer.OAuth1Consumer;
import net.oauth.exception.OAuthException;
import net.oauth.provider.OAuth1ServiceProvider;
import net.oauth.signature.impl.OAuthHmacSha1Signature;
import net.oauth.token.v1.AccessToken;
import net.oauth.token.v1.AuthorizedToken;
import net.oauth.token.v1.RequestToken;

/**
 * @author Buhake Sindi
 * @since 14 June 2011
 *
 */
public class LinkedInExample {

    private static final String LINKEDIN_API_URL = "https://api.linkedin.com";
    private static final String API_KEY = "";
    private static final String API_SECRET  = "";
    private static final String CALLBACK_URL = "http://localhost:8080/myapp/oauth/authorize_ready";
    private OAuth1Consumer consumer;


    /**
     * 
     */
    public LinkedInExample() {
        super();
        // TODO Auto-generated constructor stub
        consumer = new OAuth1Consumer(API_KEY, API_SECRET, new OAuth1ServiceProvider(LINKEDIN_API_URL + "/uas/oauth/requestToken", LINKEDIN_API_URL + "/uas/oauth/authorize", LINKEDIN_API_URL + "/uas/oauth/accessToken"));
    }

    public RequestToken requestUnauthorizedRequestToken() throws OAuthException {
        return consumer.requestUnauthorizedToken(null, CALLBACK_URL, null, new OAuthHmacSha1Signature());
    }

    public String getAuthorizationUrl(RequestToken token) throws OAuthException {
        return consumer.createOAuthUserAuthorizationUrl(token, null);
    }

    public AccessToken requestAccessToken(AuthorizedToken authorizedToken, RequestToken token) throws OAuthException {
        return consumer.requestAccessToken(null, authorizedToken, token.getTokenSecret(), new OAuthHmacSha1Signature());
    }


    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {
            LinkedInExample example = new LinkedInExample();
            RequestToken rt = example.requestUnauthorizedRequestToken();

            //Now that we have request token, let's authorize it....
            String url = example.getAuthorizationUrl(rt);

            //Copy the URL to your browser and make sure that OAuth 1 Servlet is running....
        } catch (OAuthException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

Как видите, CALLBACK_URL указывает на сервлет OAuth, сконфигурированный для JOAuth, поскольку вы получите авторизованный токен.

Вы должны убедиться, что возвращаете неавторизованный токен запроса обратно в службу по методу RequestToken getRequestToken(HttpServletRequest request), так как он понадобится вам для получения токена доступа.

Метод службы saveAccessToken() вызывается, когда LinkedIn возвращает токен доступа. Вы можете войти в систему, чтобы проверить, возвращен ли токен доступа.

Получив токен доступа, вы можете использовать LinkedIn API и публиковать вакансии, используя токен доступа. JOAuth предназначен только для получения токенов доступа и не взаимодействует с другими существующими API.

person Buhake Sindi    schedule 14.06.2011
comment
@TheEliteGentleman: Согласно @Adam, танец OAuth не требуется и не требует oob или обратного вызова для публикации вакансий в LinkedIn, поскольку он использует двухсторонние вызовы OAuth 1.0a. Поддерживает ли JOAuth двусторонние вызовы OAuth? - person Gnanam; 14.06.2011
comment
@ Gnanam, да, установите обратный вызов на oob, и вам придется самостоятельно получить авторизованный токен. - person Buhake Sindi; 14.06.2011
comment
@TheEliteGentleman: Можете ли вы предоставить мне рабочий пример для двусторонних вызовов OAuth в LinkedIn с использованием JOAuth? Кстати, мы не интегрируем это в веб-приложение, поэтому было бы слишком хорошо, если бы вы могли предоставить мне для этого отдельное Java-приложение. - person Gnanam; 14.06.2011
comment
У меня нет ключа API к LinkedIn. Как зарегистрироваться? - person Buhake Sindi; 14.06.2011
comment
@TheEliteGentleman: Вам необходимо зарегистрироваться здесь linkedin.com/secure/developer?newapp чтобы получить ключ API и секретный ключ. - person Gnanam; 14.06.2011
comment
@TheEliteGentleman: У вас была возможность зарегистрироваться и сделать двусторонний вызов OAuth для публикации вакансий? - person Gnanam; 15.06.2011
comment
@Gnanam, Twitter использует трехсторонний OAuth, а LinkedIn выдает мне signal_invalid при запросе токена запроса. Я зарегистрировал эти проблемы в LinkedIn, так как заголовок авторизации HTTP действителен на моя сторона. - person Buhake Sindi; 15.06.2011
comment
@Gnanam, вы пробовали использовать Scribe и посмотреть, сможете ли вы пройти аутентификацию в LinkedIn? Полное руководство можно найти здесь (написано создателем Scribe) и здесь (новая версия). - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: На самом деле, я пробовал старую версию Scribe, которая использует трехсторонний вызов OAuth. Это действительно было успешно, но, как сказал @Adam, похоже, что LinkedIn наконец-то должен предоставить доступ к публикации вакансий. Причина сказать это в том, что в ответ я получаю <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <error> <status>403</status> <timestamp>1308133608919</timestamp> <request-id>C4UOZP830D</request-id> <error-code>0</error-code> <message>Write access to job posting denied.</message> </error>. - person Gnanam; 15.06.2011
comment
@TheEliteGentleman: Как видите, сообщение об ошибке 403 Отказано в доступе для записи к публикации о вакансии. Между тем, я также пытаюсь реализовать то же самое в двустороннем вызове OAuth, чтобы авторизация пользователя вручную не требовалась во время публикации заданий. - person Gnanam; 15.06.2011
comment
Хорошо, тогда попробуйте использовать двухсторонний OAuth со Scribe. :) - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: из учебника Scribe я узнал, что он предназначен только для выполнения трехэтапного вызова OAuth. Я даже пытался самостоятельно подписать запрос с пустым токеном, но все же он работает на основе трехстороннего вызова OAuth. Вот ответ, который я получил: <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <error> <status>401</status> <timestamp>1308112304177</timestamp> <request-id>UYJM4ESP5J</request-id> <error-code>0</error-code> <message>[unauthorized]. The token used in the OAuth request is not valid. </message> </error> - person Gnanam; 15.06.2011
comment
@TheEliteGentleman: Как вы можете видеть выше, он говорит The token used in the OAuth request is not valid, что, как мне кажется, делает трехсторонний вызов OAuth. - person Gnanam; 15.06.2011
comment
@TheEliteGentleman: Я очень удивлен, даже после того, как погуглил, я не смог найти подходящую библиотеку/код для двустороннего вызова OAuth в Java (а затем публикации вакансий в LinkedIn). - person Gnanam; 15.06.2011
comment
@Gnanam, вы неправильно прочитали сообщение @Adam Trachtenberg (он сказал these are 2-legged OAuth 1.0a calls и нет there are 2-legged OAuth 1.0a calls). LinkedIn OAuth по-прежнему является трехсторонним протоколом OAuth, поскольку он соответствует спецификации RFC 5849. Внимательно прочитайте документацию. Писец правильный. Также, - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: Да, я тоже прочитал эту ссылку. Но API публикации вакансий LinkedIn использует двухсторонний протокол OAuth. Прочтите здесь Использование OAuth с Jobs API. The Jobs API requires authentication so we know which partner is working with the particular job and can verify that the job's poster matches up with the contract being sent. For this purpose, we are using two-legged OAuth. Также это ...Most OAuth libraries are tuned for three-legged requests so you'll need to find out how to make two-legged requests. - person Gnanam; 15.06.2011
comment
@TheEliteGentleman: Кроме того, здесь пример кода: размещение вакансии на C#, 2- Легкий вызов OAuth написан на C#. Как вы видите, для публикации вакансий используются только CONSUMER_KEY и CONSUMER_SECRET. - person Gnanam; 15.06.2011
comment
@ Гнанам, нет, не так. В примерах кода показано, как опубликовать вакансию в LinkedIn с уже установленным токеном доступа. Код никогда не показывает, как они получили токен доступа (отсюда 2 поля TOKEN и TOKEN_SECRET, которые являются токеном токена доступа и секретным токеном). Загрузите исходный код и посмотрите полную реализацию. Я только что сделал, поэтому я знаю. - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: Мне сразу пришло это в голову. Я действительно хотел поблагодарить вас за ваше терпение в поиске решения по этому вопросу. - person Gnanam; 15.06.2011
comment
@ Гнанам, какое решение? Я ничего не делал. - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: Да, на самом деле я тоже уже видел реализацию. Если вы прочитаете полностью, вы узнаете, что токен доступа никогда не получается у провайдера, и именно поэтому он всегда проверяется на if (this.Token != "") в строке № 271 в oAuthLinkedInSimple.cs. Что я мог понять, так это то, что подпись генерируется методом HMAC-SHA1 с использованием только одноразового номера, временной метки, ключа потребителя и т. д. Надеюсь, это понятно. - person Gnanam; 15.06.2011
comment
@TheEliteGentleman: Под поиском решения я подразумеваю ваши постоянные усилия вместе со мной в поисках альтернатив, изучении других библиотек и т. д. - person Gnanam; 15.06.2011
comment
@Gnanam, нет... это означает, что для вызова LinkedIn API вы должны передать свой токен доступа в LinkedIn, используя подпись HMAC-SHA1, и заполнить заголовок HTTP Authorization. - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: Хорошо. Но я не вижу никакого заявления/вызова для получения токена доступа. Можете ли вы указать мне строку №, где получен токен доступа, чтобы я мог четко понять это? - person Gnanam; 15.06.2011
comment
Маркер доступа уже получен и заполнен через переменные Token и TokenSecret. См. метод Main() в LinkedInSample.cs - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: Да, но LinkedInSample.cs написано для получения профилей из LinkedIn. Если вы посмотрите на PostJob.cs (что продемонстрировано для API публикации вакансий LinkedIn), обе переменные Token и TokenSecret не используются/не передаются. - person Gnanam; 15.06.2011
comment
@Gnanam, код объявления о вакансиях является образцом программы, просто используйте полностью рабочий код в качестве примера. - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: я считаю, что публикация вакансий также является рабочим кодом, а не образцом программы. Потому что с помощью моего коллеги из .Net Team я даже попробовал этот PostJob.cs пример рабочего кода. На мой взгляд, кажется, что это работает, но выдает ошибку 403, и я считаю, что эта ошибка связана с тем, что LinkedIn в конечном итоге должен предоставить доступ к публикации о вакансии. - person Gnanam; 15.06.2011
comment
@Gnanam, несмотря ни на что, OAuth 1 — это протокол трехсторонней авторизации. :) - person Buhake Sindi; 15.06.2011
comment
@TheEliteGentleman: в Правилах публикации вакансий в разделе Аутентификация , вы можете прочитать эту строку - The Jobs API uses two-legged OAuth for all calls. А в устаревшей модели аутентификации LinkedIn это было упомянул, что это deprecated legacy authorization format for the LinkedIn APIs. - person Gnanam; 16.06.2011
comment
@TheEliteGentleman: вы также можете узнать больше о новых изменениях API, внесенных в API публикации вакансий LinkedIn, на странице Что нового с API вакансий. - person Gnanam; 16.06.2011
comment
@TheEliteGentleman: я просто хотел сообщить вам, что новый API публикации вакансий основан на двустороннем протоколе OAuth. Таким образом, 1_ - person Gnanam; 17.06.2011
comment
Затем сделайте токен запроса и опубликуйте свои вакансии в LinkedIn. - person Buhake Sindi; 17.06.2011

Чтобы уточнить несколько вещей:

1) Это двусторонние вызовы OAuth 1.0a. Вам не нужно танцевать OAuth. 2) Это не нужно для oob или что-то в этом роде. 3) Вы создаете заголовок авторизации, используя выбранную вами библиотеку OAuth, и отправляете HTTP POST.

Вот краткое руководство: http://developer.linkedin.com/docs/DOC-1299

При этом я еще раз повторю, что это закрытая программа, поэтому, если вы не входите в специальный белый список партнеров, ваши звонки не будут выполнены, даже если вы решите все вышеперечисленное.

Кроме того, для успешного выполнения вашего запроса требуется дополнительная авторизация вашего приложения со стороны автора объявления о вакансии в их учетной записи LinkedIn, а соответствующие данные должны быть в теле XML POST.

В зависимости от количества вопросов, которые у вас возникли по этому поводу, если вы являетесь партнером из белого списка, свяжитесь с командой LinkedIn Jobs API, и мы организуем дополнительную помощь.

person Adam Trachtenberg    schedule 14.06.2011
comment
К сожалению, регистрация не означает, что вы будете одобрены. Я только оказываю техническую поддержку, а не принимаю эти решения. :(Команде Джобса нужно будет вернуться к вам, прежде чем будет иметь смысл делать здесь больше. - person Adam Trachtenberg; 14.06.2011
comment
Прошло около 2 недель, я до сих пор не получил ответа от команды Jobs, чтобы предоставить мне доступ к размещению вакансий. Я также зарегистрировал запрос - Предоставить доступ к посттестовым заданиям. Можете ли вы помочь мне в этом? Или есть альтернативный адрес электронной почты/телефон, по которому я могу связаться? - person Gnanam; 16.06.2011
comment
@Gnanam: я связался с командой, чтобы попросить их предоставить вам обновление статуса. - person Adam Trachtenberg; 17.06.2011
comment
Я действительно удивлен. Я еще не получил никакого ответа от команды Джобса. - person Gnanam; 28.06.2011
comment
правильно ли oauth-config.xml? я получаю не могу найти ошибку oauth объявления - person pradeep cs; 10.07.2012