我有一个Keycloak(standalone)v1.9.4.Final安装设置使用AWS实例上的Wildfly 10,并试图使用keycloak(通过keycloak的登录页面)和Twitter4j来验证用户身份Twitter,然后明显让我的应用程序进行身份验证并查看用户时间表等。访问由Keycloak返回的用户Oauth令牌
我配置了身份提供商(Twitter),领域和我的客户端应用程序。
我还在apps.twitter.com上设置了Twitter应用程序设置,并将密钥放入我的twitter4j.properties文件中。
到目前为止,我能:
- 转到我的应用程序的JSF网页,并重定向到Keycloak的/ AUTH登录页面
- 点击Twitter的标志和我的Twitter帐户(独立账户的登录该帐户拥有Twitter应用程序)
- 完成Keycloak要求的用户信息
- 完成用户信息后,Keycloak成功地将用户导回到客户端应用程序(在本例中为JSF页面)。
问题是,我无法弄清楚如何访问用户OAuth AccessToken和AccessTokenSecret与Twitter应用程序的ConsumerKey和ConsumerKeySecret结合。
下面是代码中的相关片段:
twitterLogin.xhtml
...
#{twitterBean.getUserInfo()}
...
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();
...
}
取决于我们如何安排的各种令牌(尝试不同的令牌字符串在不同的地方),我们会在调用verifyCredentials()时返回不同的错误,但所有的错误基本上是“无效认证”。
对我们来说很明显,.getTokenString()和.getIdTokenString()方法并不是正确的方法,但我们对Keycloak在哪里提供用户的oauth标记感到不知所措。我们尝试着着眼于facesContext.getExternalContext()。getRequest()和facesContext.getExternalContext()。getResponse(),但没有多少运气。
我的问题是,当Keycloak重定向回客户端应用程序(服务提供者)后,用户使用Twitter进行身份验证并在Keycloak中注册用户,oauth令牌的位置在哪里,以便我们可以访问它们,然后双击认证(应用程序/用户认证)?