使用JOAuth库在LinkedIn中发布作业

时间:2011-06-14 07:21:12

标签: java oauth linkedin joauth

这是我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?

2 个答案:

答案 0 :(得分: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通信。

答案 1 :(得分:0)

澄清一些事情:

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

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

话虽如此,我将再次重申,这是一个封闭的计划,所以除非你是一个特殊的白名单合作伙伴,否则即使你解决了上述问题,你的电话也会失败。

此外,您的LinkedIn帐户中的工作海报还需要您的申请,以使您的请求成功,相关数据需要在XML POST正文中。

根据您对此问题的数量,如果您是白名单合作伙伴,请跟进LinkedIn Jobs API小组,我们会安排其他帮助。