Java 使用JOAuth库在LinkedIn中发布作业
这是我在上发布的问题的继续。我不熟悉这种基于OAuth的发布作业认证,在这个过程中我也在学习。如果我的问题很基本/幼稚,请容忍我 我正在尝试使用库进行OAuth身份验证,并将作业发布到LinkedIn。我正在使用OAuth2调用。我对JOAuth library有以下问题:Java 使用JOAuth库在LinkedIn中发布作业,java,oauth,linkedin,joauth,Java,Oauth,Linkedin,Joauth,这是我在上发布的问题的继续。我不熟悉这种基于OAuth的发布作业认证,在这个过程中我也在学习。如果我的问题很基本/幼稚,请容忍我 我正在尝试使用库进行OAuth身份验证,并将作业发布到LinkedIn。我正在使用OAuth2调用。我对JOAuth library有以下问题: 在JOAuth链接上显示的示例中,如何获取LinkedIn的请求令牌?我找不到任何请求令牌的语句。但是我可以看到consumer.generateRequestAuthorizationUrl(ResponseType.co
consumer.generateRequestAuthorizationUrl(ResponseType.code,redirectUri,null,(String[])null)代码>
重定向URI
中传递/设置什么要澄清几件事: 1) 这是两条腿的OAuth 1.0a呼叫。你不需要跳OAuth舞。 2) 这是没有必要的oob或类似的东西。 3) 您可以使用自己选择的OAuth库生成授权头,并发送HTTP POST 以下是一个快速开始: 话虽如此,我将再次重申,这是一个封闭的计划,因此,除非您在一组特殊的白名单合作伙伴中,否则即使您解决了上述所有问题,您的呼叫也将失败 此外,为了使您的申请成功,您的申请还需要通过他们的LinkedIn帐户中的招聘海报进行额外授权,相关数据需要保存在XML帖子正文中
根据您对此提出的大量问题,如果您是白名单上的合作伙伴,请与LinkedIn Jobs API团队联系,我们将安排额外的帮助。您感到困惑。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>
现在,我们需要创建一个服务,该服务将从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\u URL
设置为指向配置为JOAuth的OAuth Servlet,因为您将收到一个授权令牌
您必须确保通过RequestToken getRequestToken(HttpServletRequest)
方法将未经授权的请求令牌返回给服务,因为您需要它来检索访问令牌
LinkedIn返回访问令牌时,将调用服务saveAccessToken()
方法。您可以登录以验证是否返回了访问令牌
拥有访问令牌后,可以使用LinkedIn API并使用访问令牌发布作业。JOAuth仅用于检索访问令牌,而不与现有的其他API通信。是的,我已经注册了此程序。您能否提供一些用Java编写的指针/资源,这些指针/资源可以
使用您选择的OAuth库生成授权头并发送HTTP POST
?我真的很难通过这个。此外,甚至我也在jobsapi@linkedin.com
但还没有回应。如果可能的话,你能安排进一步的帮助吗?不幸的是,注册并不意味着你会被批准。我只提供技术支持,不做那些决定(在这里做更多工作之前,工作小组需要回复你。已经两周了,我还没有收到工作小组的任何回复,允许我发布工作。我还记录了一个请求-。你能帮我加快这一步吗?或者我能找到其他电子邮件/电话吗?@Gnanam:我已经ping了e团队要求他们向您提供状态更新。我真的很惊讶。我还没有收到Jobs团队的任何回复。@TheeletteGentler:根据@Adam,在LinkedIn中发布Jobs时不需要oob或回调,因为它使用两条腿的OAuth 1.0a调用。JOAuth支持两条腿的OAuth调用吗?@Gnanam,y是的,将callback设置为oob
,您必须自己检索授权令牌。@TheLiteGenister:您能给我一个使用JOAuth对LinkedIn进行两段OAuth调用的工作示例吗?顺便说一句,我们没有将其集成到web应用程序中,因此,如果您能为我提供一个独立的Java应用程序,那就太好了他的。我没有LinkedIn的API密钥。我如何注册它?@TheElite先生:你需要在这里注册以获得API密钥和密钥。对不起,旧的joauth_1_2_1.jar
在为OAuth 1创建授权
头时有缺陷。新的joauth_1_3_1.jar
包含修复程序,并严格遵循了RFC 5849。
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();
}
}
}