2

我正在尝试为我的网站验证linkedin 用户。我正在使用 Scribe 来处理身份验证。

我正在尝试分两步执行此操作。

step1 只是获取正确的 url 并将用户重定向到确认页面。这工作正常。在我确认后,我被重定向回我网站上的一个页面。

第 2 步是我遇到的问题。当重定向的 xpage 打开时,我使用来自 url 的令牌和验证器密钥调用 step2 方法。

我没有得到的一件事是,如果我真的需要在两个步骤中构建服务,以及这是否是导致我的问题的原因。如何在我的两个步骤之间发送 requestToken。请建议如何使这种情况发挥作用

谢谢 - 托马斯


import org.scribe.builder.ServiceBuilder;
import org.scribe.oauth.OAuthService;
import java.util.Scanner;
import org.scribe.builder.*;
import org.scribe.model.*;
import org.scribe.oauth.*;
import org.scribe.builder.api.*;
import javax.faces.context.*;


public class DoDance
{
      private static final String PROTECTED_RESOURCE_URL = "http://api.linkedin.com/v1/people/~/connections:(id,last-name)";

  public void step1()
  {
     try {
            OAuthService service = new ServiceBuilder()
            .provider(LinkedInApi.class)
            .apiKey("key")
            .apiSecret("secret")
            .callback("http://www.acme.com/linkedin.xsp")
            .build();

        Token requestToken = service.getRequestToken();
        String authUrl = service.getAuthorizationUrl(requestToken);

        // Redirects the user to linkedin confirmation page
        // This is working fine
        FacesContext.getCurrentInstance().getExternalContext().redirect(authUrl);

    } catch (Exception e) {
        e.printStackTrace(); 
    }
  }

  public String step2(String tok,String ver){

      // this method is called in the beforeRenderResponse in the redirected xpage
      // I get the token and verifyer in from the url parameters

    Response response = null;
    try {
          OAuthService service = new ServiceBuilder()
          .provider(LinkedInApi.class)
          .apiKey("key")
          .apiSecret("secret")
          .build();

          Token accessToken = service.getAccessToken(???,new Verifier(ver));
          OAuthRequest request = new OAuthRequest(Verb.GET, PROTECTED_RESOURCE_URL);
          service.signRequest(accessToken, request);
          response = request.send();

    } catch (Exception e) {
        e.printStackTrace();
    }
    return "Body = " + response.getBody();

  }


}
4

2 回答 2

4

尝试在(会话范围的)用户 bean 中存储和检索 requestToken。

public class User {

private Token requestToken;

private static String BEAN_NAME = "userBean";

public static User get() {
    FacesContext context = FacesContext.getCurrentInstance();
    return (User) context.getApplication().getVariableResolver().resolveVariable(context, BEAN_NAME);
}

public Token getRequestToken() {
    return requestToken;
}

public void setRequestToken(Token requestToken) {
    this.requestToken = requestToken;
}


}

您可能还需要更改 JVM 的安全设置以使用 Scribe。将此添加到 Domino 服务器的 java.policy 文件中:

grant {
permission java.util.PropertyPermission
"http.keepAlive", "read, write";
};

最后:您不需要从 beforeRenderResponse 事件中传递令牌和验证器。可以使用 step2 函数轻松检索它们

XSPContext context = XSPContext.getXSPContext( FacesContext.getCurrentInstance() );
String oauth_verifier = context.getUrlParameter("oauth_verifier");
于 2012-03-22T12:04:33.300 回答
2

不要试图重新发明轮子。社会推动者正是这样做的,而且做得更多。

这是我写的一些早期文档:http ://www.openntf.org/Projects/pmt.nsf/DA2F4D351A9F15B28625792D002D1F18/%24file/SocialEnabler111006.pdf

关于“社交促成者与密钥商店密切相关” - 这实际上是一个很大的好处。如果您想做的不仅仅是原型,您需要提出一个解决方案,如何以及在何处集中管理应用程序密钥和用户密钥。

您也不想将这个 OAuth 舞蹈代码放在每个 NSF 中,而是使用可以在全球部署的社交启用插件。

我们在 LinkedIn 上尝试了社交推动者,它很有效。我们只是不被允许开源这个样本。

于 2012-03-23T06:40:06.683 回答