2

サイトのリンクイン ユーザーを認証しようとしています。Scribe を使用して認証を処理しています。

私はこれを2段階のプロセスでやろうとしています。

step1 は正しい URL を取得し、ユーザーを確認ページにリダイレクトするだけです。これはうまくいっています。確認した後、自分のサイトのページにリダイレクトされます。

ステップ2は私が問題を抱えているものです。リダイレクトされた xpage が開いているときに、URL のトークンと検証キーを使用して step2 メソッドを呼び出しています。

私が得られないことの 1 つは、両方のステップでサービスを構築する必要があるかどうか、およびこれが問題の原因であるかどうかです。2 つのステップの間に 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;
}


}

また、Scribe を使用するには、おそらく JVM のセキュリティ設定を変更する必要があります。これを 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

車輪の再発明を試みないでください。ソーシャル イネーブラーはまさにこれを行い、さらに多くのことを行います。

ここに私が書いたいくつかの初期のドキュメントがあります:

「ソーシャル イネーブラーはキー ストアと密接に結びついている」という点では、これは実際には大きな利点です。プロトタイプ以上のことをしたい場合は、アプリ キーとユーザー キーの両方を集中管理する方法と場所を考え出す必要があります。

また、この OAuth ダンス コードをすべての NSF に配置するのではなく、グローバルにデプロイできるソーシャル イネーブラー プラグインを使用します。

LinkedIn でソーシャル イネーブラーを試してみましたが、うまくいきました。このサンプルをオープンソース化することは許可されていません。

于 2012-03-23T06:40:06.683 に答える