2016-05-16 8 views
1

Keycloak(スタンドアロン)v1.9.4.FinalインストールのセットアップはAWSインスタンスでWildfly 10を使用しており、keycloak(keycloakのログインページ経由)とTwitter4jを使用してユーザーを認証しようとしています私のアプリケーションは、ユーザーのタイムラインなどを認証して閲覧することができます。Keycloakから返されたユーザーOauthトークンへのアクセス

私はアイデンティティプロバイダ(Twitter)、レルム、およびクライアントアプリケーションを設定しました。

また、apps.twitter.comにTwitterアプリケーションの設定があり、twitter4j.propertiesファイルにキーが設定されています。

  1. ゴー自分のアプリケーションのJSFのWebページへとKeycloakの/認証ログインページにリダイレクトされます
  2. Twitterのロゴをクリックして、自分のTwitterアカウント(別のアカウントからでログイン:

    はこれまでのところ、私ができることになっています

  3. Keycloakが尋ねるユーザー情報の入力
  4. ユーザー情報の入力後、Keycloakは、ユーザーをクライアントアプリケーション(この場合はJSFページ)に戻すことに成功しました。

問題は、OAuth AccessTokenとAccessTokenSecretにアクセスして、TwitterアプリケーションのConsumerKeyとConsumerKeySecretを組み合わせる方法がわかりません。私たちは、様々なトークンを手配する方法に応じて(別のトークンをしようとTwitterBean.java

@Context 
private final FacesContext facesContext = FacesContext.getCurrentInstance(); 
private final Twitter twitter = TwitterFactory.getSingleton(); 

public String getUserInfo() { 

    if (facesContext != null) { 
     HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(false); 
     KeycloakSecurityContext keycloakContext = (RefreshableKeycloakSecurityContext) httpSession.getAttribute(KeycloakSecurityContext.class.getName()); 
     queryTwitter(keycloakContext.getTokenString(), keycloakContext.getIdTokenString()); 
    } 
} 

public void queryTwitter(String accessToken, String accessTokenSecret) { 
    ConfigurationBuilder cb = new ConfigurationBuilder(); 
    cb.setDebugEnabled(true) 
      .setOAuthConsumerKey("APPLICATIONS_CONSUMER_KEY") 
      .setOAuthConsumerSecret("APPLICATIONS_CONSUMER_KEY_SECRET") 
      .setOAuthAccessToken(accessToken) 
      .setOAuthAccessTokenSecret(accessTokenSecret); 
    TwitterFactory tf = new TwitterFactory(cb.build()); 
    twitter = tf.getInstance(); 
    user = twitter.verifyCredentials(); 
    ... 
} 

twitterLogin.xhtml

... 
#{twitterBean.getUserInfo()} 
... 


:以下

はコードの関連するスニペットです異なる場所にある文字列)、verifyCredentials()を呼び出すときにTwitterによって返されるエラーが異なりますが、すべて本質的に「無効な認証」です。

.getTokenString()メソッドと.getIdTokenString()メソッドは正しいメソッドではありませんが、Keycloakがユーザーのoauthトークンを提供する場所は紛失しています。

facesContext.getExternalContext()。getRequest()とfacesContext.getExternalContext()。getResponse()を見てみました。

私の質問は、ユーザーがTwitterで認証してKeycloak内にユーザーを登録した後、Keycloakがクライアントアプリケーション(サービスプロバイダ)にリダイレクトされたときにoauthトークンが保持されているため、認証(アプリケーション/ユーザー認証)?

答えて

1

がうまくいけば、このコードスニペットは誰か...

@PostConstruct 
public void init() { 
    facesContext = FacesContext.getCurrentInstance(); 
} 


public void login() { 

    if (user == null) { 

     if (facesContext != null) { 
      HttpSession httpSession = (HttpSession) facesContext.getExternalContext().getSession(false); 
      KeycloakSecurityContext keycloakContext = (RefreshableKeycloakSecurityContext) httpSession.getAttribute(KeycloakSecurityContext.class.getName()); 
      MyAccessToken accessToken = generateMyAccessToken(keycloakContext); 

     } 
    } 
} 

private MyAccessToken generateMyAccessToken(KeycloakSecurityContext keycloakContext) { 
    AccessToken keycloakToken = keycloakContext.getToken(); 
    MyAccessToken token = new MyAccessToken(); 

    token.withEmail(keycloakToken.getEmail()) 
      .withExpiration(keycloakToken.getExpiration()) 
      .withUsername(keycloakToken.getPreferredUsername()) 
      .withOauthToken(getTwitterOAuthResponse(keycloakContext.getTokenString())) 
      .withFirstName(keycloakToken.getGivenName()) 
      .withLastName(keycloakToken.getFamilyName()); 

    return token; 
} 

private OAuthTokenWrapper getTwitterOAuthResponse(final String tokenString) { 
    ClientRequestFilter authFilter = new ClientRequestFilter() { 
     @Override 
     public void filter(ClientRequestContext requestContext) throws IOException { 
      requestContext.getHeaders().add(HttpHeaders.AUTHORIZATION, "Bearer " + tokenString); 
     } 
    }; 

    Client client = ClientBuilder.newBuilder().register(authFilter).build(); 
    WebTarget target = client.target(getIdentityProviderTokenUrl()); 

    TwitterOAuthResponse resp = target.request().get().readEntity(TwitterOAuthResponse.class); 
    return new OAuthTokenWrapper(resp.getToken(), resp.getTokenSecret()); 
} 

private String getIdentityProviderTokenUrl() { 
    return "https://login.example.com:8443/auth/realms/myapp/broker/twitter/token"; 

}

を支援します
関連する問題