【问题标题】:Does Keycloak allow obtaining id tokens via web interfaceKeycloak 是否允许通过 Web 界面获取 id 令牌
【发布时间】:2019-03-19 18:25:02
【问题描述】:

我正在研究如何使用 OpenID Connect 和 Keycloak 对 Kubernetes 1.13 集群进行身份验证。我是这个领域的新手。

ThisYouTube 视频(“为 Kubernetes API 服务器使用 Open ID Connect”)完成了我想要的部分功能。 id 令牌最初是通过向 Keycloak 引用授权类型 password 发出 HTTP 请求(使用 curl)获得的。生成的令牌随后将用于对 Kubernetes API 的进一步 HTTP 请求。这可行,但缺点是客户端直接处理用户的永久凭据。

如果令牌是由一个安全网页颁发的,该网页还需要通过 Keycloak 进行身份验证(这次使用授权类型授权代码)并且除了显示一个新令牌之外什么都不做,这不是更好吗?这样的令牌(瞬态凭证)然后可以例如手动复制到 kubeconfigs 中以供进一步使用?

Keycloak 是否提供此类交互式网页(在 REST 端点旁边以编程方式获取令牌)还是超出范围?如果是第二个,是否还有其他标准组件可用于此类任务?

更新 This 来自 Kubernetes documentation 的插图可能更清楚地说明了我在寻找什么。在步骤 1 中,用户应登录身份提供程序以获取令牌,然后将其配置为 kubectl。 Keycloak 是否支持此步骤,即提供一个用户可以登录以获取其令牌的网页?

【问题讨论】:

    标签: security oauth-2.0 kubernetes openid-connect keycloak


    【解决方案1】:

    如果我能理解你的问题,那么你想通过 Java 代码获取访问令牌,那么这里是你可以编写和调用的代码

      String obtainAccessToken = obtainAccessToken(username, password);
      putRequest.addHeader("Authorization", "bearer " + obtainAccessToken);
      putRequest.addHeader("content-type", MediaType.APPLICATION_JSON);
    

    这是你应该调用的方法

    public String obtainAccessToken(String UserName, String pwd)
        {
            AuthzClient authzClient = AuthzClient.create(configuration);
            AccessTokenResponse accessTokenResponse = authzClient.obtainAccessToken(UserName, pwd);
            String token = accessTokenResponse.getToken();
            return token;
        }
    

    这里是获取领域的方法

    public Response getAllRealms() {
            ObjectMapper mapper = JacksonObjectMapperProvider.getObjectMapper();
            CloseableHttpResponse response = null;
            List<SureRealmRepresentation> realmList = new ArrayList<SureRealmRepresentation>();
            int status;
            try {
                String urlGetAllRealms = URL + "/admin/realms";
                CloseableHttpClient httpclient = HttpClients.createDefault();
                HttpGet getRequest = new HttpGet(urlGetAllRealms);
                String obtainAccessToken = obtainAccessToken(username, password);
                getRequest.addHeader("Authorization", "bearer " + obtainAccessToken);
                getRequest.addHeader("content-type", MediaType.APPLICATION_JSON);
                response = httpclient.execute(getRequest);
                status = response.getStatusLine().getStatusCode();
                String responseBody = EntityUtils.toString(response.getEntity());
                if (status == 200) {
                    RealmRepresentation[] realmArray = mapper.readValue(responseBody, RealmRepresentation[].class);
    }
    catch (Exception e) {
                if (e instanceof Exception) {
                    throw (Exception) e;
                } else {
                    throw ErrorHandler.wrap(new Exception("EroorType : "+ e.toString()));
                }
            }
    

    【讨论】:

    • 我也可以使用curl 获取 id 令牌,这很好。我没有的是一个网站,用户可以在其中以用户友好的方式(无密码授予)获取他的令牌。我想知道这是使用标准工具的标准案例,还是必须自己构建这样的页面。
    • @rookie099 您是否希望 Keycloak 提供一种无需提供密码即可获取令牌的方法?用户应该输入他/她的用户名,它会返回令牌给用户?
    • 不,不是没有密码,只是没有授权类型password grant
    猜你喜欢
    • 2021-10-08
    • 2021-08-13
    • 2011-11-24
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    相关资源
    最近更新 更多