0

这是我在LinkedIn Job Posting API implementation in Java上发布的问题的延续。我是这种基于 OAuth 的发布职位身份验证的新手,并且在此过程中也在学习。如果我的问题非常基本/幼稚,请多多包涵。

我正在尝试使用JOAuth库进行 OAuth 身份验证并将工作发布到 LinkedIn。我正在使用 OAuth2 调用。我对 JOAuth 库有以下疑问:

  1. 在 JOAuth 链接中显示的示例中,如何获取 LinkedIn 的请求令牌?我没有找到任何请求请求令牌的声明。但我可以看到consumer.generateRequestAuthorizationUrl(ResponseType.CODE, redirectUri, null, (String[])null));
  2. 如果我想使用基于oob的回调重定向,那么我需要传递/设置redirectUri什么?
  3. 如果一切顺利并且我有访问令牌,我如何最终在http://api.linkedin.com/v1/jobs提交/发送我的工作数据 XML ?
4

2 回答 2

1

你很困惑。LinkedIn 使用 OAuth 1 协议而不是 OAuth 2 协议。以下是您将如何向/使用 LinkedIn 进行 Oauth 1 授权。

如果您正在创建 Web 应用程序,请在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设置为指向配置为 JOAuth 的 OAuth Servlet,因为您将收到一个授权令牌。

您必须确保将未经授权的请求令牌返回给RequestToken getRequestToken(HttpServletRequest request)方法上的服务,因为您需要它来检索访问令牌。

当 LinkedIn 返回访问令牌时调用服务saveAccessToken()方法。您可以登录以验证是否返回了访问令牌。

获得访问令牌后,您可以使用 LinkedIn API 并使用访问令牌发布职位。JOAuth 旨在仅检索访问令牌,而不与存在的其他 API 进行通信。

于 2011-06-14T08:14:41.077 回答
0

澄清几点:

1) 这些是两条腿的 OAuth 1.0a 调用。您不需要进行 OAuth 舞蹈。2)这些不需要oob或类似的东西。3) 您使用您选择的 OAuth 库生成授权标头并发送 HTTP POST。

这是一个快速入门:http: //developer.linkedin.com/docs/DOC-1299

话虽如此,我将再次重申这是一个封闭的程序,因此除非您在一组特殊的白名单合作伙伴中,否则即使您解决了上述所有问题,您的呼叫也会失败。

此外,为了使您的请求成功,并且相关数据需要在 XML POST 正文中,您的申请还需要通过其 LinkedIn 帐户中的职位发布者的额外授权。

根据您对此问题的数量,如果您是列入白名单的合作伙伴,请与 LinkedIn Jobs API 团队联系,我们将安排额外帮助。

于 2011-06-14T07:30:14.657 回答