当前位置: 首页 > 知识库问答 >
问题:

访问Keycloak返回的用户Oauth令牌

林修真
2023-03-14

我有一个Keycloak(独立)V1.9.4。最后在AWS实例上使用Wildfly 10安装安装程序,并尝试使用Keycloak(通过Keycloak的登录页面)和Twitter4j来验证Twitter用户,然后明显地让我的应用程序验证并查看用户的时间线等。

我已经配置了身份提供程序(Twitter)、领域和我的客户端应用程序。

我还在apps.Twitter.com上设置了一个Twitter应用程序,并将密钥放入我的twitter4j.properties文件中。

到目前为止,我能够:

  1. 转到我的应用程序的JSF网页并重定向到KeyCloak的/auth登录页面
  2. 单击Twitter徽标并使用我的Twitter帐户(与拥有Twitter应用程序的帐户分开的帐户)登录
  3. 完成Keycloak要求的用户信息
  4. 完成用户信息之后,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();
    ...
}

根据我们如何安排各种令牌(在不同的地方尝试不同的令牌字符串),Twitter在调用verifyCredentials()时返回不同的错误,但本质上都是“无效身份验证”。

很明显.getTokenString()和.getIDTokenString()方法不是正确的方法,但是我们不知道Keycloak将在哪里提供用户的oauth令牌。

我们试图查看facesContext.getExternalContext().getRequest()和facesContext.getExternalContext().getResponse(),但没有太大的运气。

我的问题是,当用户使用Twitter进行身份验证并在Keycloak中注册用户后,Keycloak重定向回客户端应用程序(服务提供者)时,oauth令牌保存在哪里,以便我们能够获得对它们的访问权,然后进行双重身份验证(应用程序/用户身份验证)?

共有1个答案

能修谨
2023-03-14

希望这段代码能帮助某人...

@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";

}

 类似资料:
  • 我设置了一个Spring OAuth2服务器,当客户端进行身份验证时它工作正常。问题是当客户端是浏览器时,访问令牌会显示在地址栏上的重定向URL上,并且浏览器会记住它。 身份验证服务器是否有办法在重定向的同时以更安全的方式发回访问令牌。

  • 我必须将一个遗留的身份验证系统移到Keycloak,并且我不能更改客户端上的实际工作流。因此,我需要用我的api(在node.js中)提供一个用户创建和登录系统,该系统反过来代表用户从Keycloak创建和获取访问令牌。 我能够创建一个用户,但我无法找到为该用户生成访问令牌的方法。我找到的唯一解决办法是创建一个用户并设置一个随机密码,然后要求授予提供用户名和密码的用户,但这意味着我必须在自己的一侧

  • 我使用Keycloak来保护我的react前端和Node.js后端。这些客户端使用基于角色的授权进行保护。 我尝试这个endpoint来撤消用户访问令牌。但不起作用/auth/admin/realms//users/ 是否有方法在Keycloak中撤销特定用户的访问令牌?

  • 本文向大家介绍oauth 刷新访问令牌,包括了oauth 刷新访问令牌的使用技巧和注意事项,需要的朋友参考一下 示例 资源

  • 我试图使用从Spring应用程序中的公共客户端获取访问令牌。 谁能帮我弄清楚我做错了什么吗?