基于Scribe example on github,我正在尝试授权我的应用程序使用LinkedIn的API。
这是我当前的代码,它与点击按钮相关联:
public String generateFromLinkedIn() {
OAuthService service = new ServiceBuilder()
.provider(LinkedInApi.class)
.apiKey(apiKey)
.apiSecret(apiSecret)
.callback("http://localhost:8080/Project/faces/linkedIn.xhtml").build();
ExternalContext externalContext = FacesContext.getCurrentInstance()
.getExternalContext();
Token requestToken = service.getRequestToken();
String authUrl = service.getAuthorizationUrl(requestToken);
try {
externalContext.redirect(authUrl);
} catch (IOException ex) {
Logger.getLogger(LinkedInController.class.getName()).log(Level.SEVERE, null, ex);
}
Map<String, String> parameterMap = (Map<String, String>) externalContext.getRequestParameterMap();
Verifier v = new Verifier(parameterMap.get("oauth_verifier"));
Token accessToken = service.getAccessToken(requestToken, v);
OAuthRequest request = new OAuthRequest(Verb.GET, "https://api.linkedin.com/v1/people/~");
service.signRequest(accessToken, request);
Response response = request.send();
System.err.println(response.getBody());
return "";
}
在我的.xhtml页面中,我有:
<h:commandButton value="Generate" action="#{linkedInController.generateFromLinkedIn()}"></h:commandButton>
一切正常,直到我尝试从参数图中获取Verifier,而参数图中没有任何oauth_verifier。我尝试将其拆分为多个方法,但到目前为止,我无法从URL参数中获取oauth_verifier,即使从LinkedIn授权对话框返回后它显然已经存在。
有关如何正确获取此验证程序或如何使Scribe与JSF一起使用的任何建议?
答案 0 :(得分:1)
你似乎在某种程度上期望重定向的请求神奇地返回到代码中的完全相同的位置并从那里继续。这是不真实的。它实际上是2个HTTP请求。您基本上仍然在当前请求的参数映射(调用generateFromLinkedIn()
方法的请求)中摆弄。
致电redirect()
后,您应该从该方法返回。您应该将代码的其余部分移动到与@PostConstruct
绑定的支持bean的<f:viewAction>
或linkedIn.xhtml
。这是用参数调用的人。