问题描述
|
这是我在Java上的LinkedIn Job Posting API实现上发布的问题的延续。我是发布作业的基于OAuth的身份验证的新手,并且在此过程中也正在学习。如果我的问题非常基础/天真,请与我一起接受。
我正在尝试使用JOAuth库进行OAuth身份验证并将作业发布到LinkedIn。我正在使用OAuth2调用。我对JOAuth库有以下疑问:
在JOAuth链接显示的示例中,如何获取LinkedIn的请求令牌?我找不到任何请求请求令牌的声明。但我看到
consumer.generateRequestAuthorizationUrl(ResponseType.CODE,redirectUri,null,(String[])null));
如果我想使用基于oob的回调重定向,那么我需要在redirectUri
中传递/设置什么?
如果一切成功,并且我拥有访问令牌,那么我最终如何在http://api.linkedin.com/v1/jobs上提交/发送我的Job数据XML?
解决方法
你很困惑。 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();
}
}
}
如您所见,“ 9”设置为指向配置为JOAuth的OAuth Servlet,因为您将收到一个“授权令牌”。
您必须确保通过RequestToken getRequestToken(HttpServletRequest request)
方法将未授权的请求令牌返回给服务,因为您将需要它来检索访问令牌。
当LinkedIn返回访问令牌时,将调用服务saveAccessToken()
方法。您可以登录以验证是否返回了访问令牌。
获得访问令牌后,就可以使用LinkedIn API并使用访问令牌发布作业。 JOAuth设计为仅检索访问令牌,并且不与存在的其他API通信。
, 为了澄清一些事情:
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小组联系,我们将为您提供更多帮助。