关键词

Keycloak各种配置及API的使用说明

Keycloak各种配置及API的使用说明

前言

Keycloak是一个完整的开源身份和访问管理解决方案,它提供了一组统一的API,可用于管理身份验证、授权和保护应用和服务。

本文将详细介绍如何配置Keycloak以及如何使用其API进行身份验证、授权等操作。

配置Keycloak

创建一个Keycloak Realm

  1. 登录Keycloak控制台,选择左侧的"Add Realm"按钮,输入一个唯一的Realm名称并单击“Create”。
  2. 在“Realm Settings”下,包括“Login”,客户端等设置。

创建一个客户端

  1. 在Keycloak控制台中,导航到您刚刚创建的Realm并单击客户端标签页。
  2. 单击“Add Client”添 加一个新客户端。
  3. 输入客户端ID,选择客户端协议,单击“Save”即可。

创建用户和角色

  1. 在Keycloak控制台上,导航到Realm,并单击“Users”选项卡。
  2. 单击“Add user”按钮添加一个新用户,并输入所需的信息。单击“Save”即可。
  3. 在“Roles”选项卡下,添加所需的角色并分配给创建的用户。

配置回调URL和重定向URI

在使用Keycloak进行身份验证时,重定向URI和回调URL设置是至关重要的。

  1. 在创建客户端时,输入正确的重定向URI和回调URL,确保这些URL在您的Web应用程序中存在并能够正常使用。
  2. 另外,确保在您的Web应用程序中正确配置Keycloak编写的适配器,以接受从Keycloak发送的身份验证请求。

使用Keycloak API

获取AccessToken

要使用Keycloak API进行身份验证和授权,您需要先获取AccessToken。

public String getAccessToken(String username, String password, String clientId, String clientSecret, String realmName) {

    try (CloseableHttpClient client = HttpClients.createDefault()) {

        HttpPost post = new HttpPost(String.format("http://localhost:8080/auth/realms/%s/protocol/openid-connect/token", realmName));

        List<NameValuePair> urlParameters = new ArrayList<>();
        urlParameters.add(new BasicNameValuePair("grant_type", "password"));
        urlParameters.add(new BasicNameValuePair("client_id", clientId));
        urlParameters.add(new BasicNameValuePair("client_secret", clientSecret));
        urlParameters.add(new BasicNameValuePair("username", username));
        urlParameters.add(new BasicNameValuePair("password", password));

        post.setEntity(new UrlEncodedFormEntity(urlParameters));

        try (CloseableHttpResponse response = client.execute(post)) {
            HttpEntity entity = response.getEntity();
            String responseJson = EntityUtils.toString(entity);
            JSONObject jsonObject = new JSONObject(responseJson);
            return jsonObject.getString("access_token");
        }

    } catch (IOException | JSONException e) {
        e.printStackTrace();
    }

    return null;
}

调用Keycloak保护的API

Keycloak可以使用Token保护API,并只允许授权用户访问API。

public String callProtectedAPI(String accessToken, String url) {

    HttpGet request = new HttpGet(url);

    request.addHeader("Authorization", "Bearer " + accessToken);

    try (CloseableHttpClient client = HttpClients.createDefault();
         CloseableHttpResponse response = client.execute(request)) {

        HttpEntity entity = response.getEntity();
        String responseJson = EntityUtils.toString(entity);
        return responseJson;

    } catch (IOException e) {
        e.printStackTrace();
    }

    return null;
}

示例

示例1:Java中的Keycloak API

以下示例演示如何使用Java中的Keycloak API验证用户凭证并从Keycloak受保护的API中检索数据。

public class KeycloakDemo {

    public static void main(String[] args) {

        String realmName = "demo";
        String username = "user1";
        String password = "password";
        String clientId = "demo-app";
        String clientSecret = "67a1d773-7e7d-47aa-bc19-785751e23fdc";
        String apiEndpoint = "http://localhost:8081/api/endpoint";

        KeycloakDemo demo = new KeycloakDemo();
        String accessToken = demo.getAccessToken(username, password, clientId, clientSecret, realmName);

        String apiResponse = demo.callProtectedAPI(accessToken, apiEndpoint);

        System.out.println(apiResponse);

    }

    public String getAccessToken(String username, String password, String clientId, String clientSecret, String realmName) {

        // Implement getAccessToken method from above

    }

    public String callProtectedAPI(String accessToken, String url) {

        // Implement callProtectedAPI method from above

    }
}

示例2:JavaScript中的Keycloak API

以下示例演示如何使用JavaScript中的Keycloak API验证用户凭证并从Keycloak受保护的API中检索数据。

<!DOCTYPE html>
<html>
<head>
    <title>Keycloak demo</title>
    <script src="https://cdn.jsdelivr.net/npm/keycloak-js@15.0.2/dist/keycloak.js"></script>
    <script>

    const kcConfig = {
        url: 'http://localhost:8080/auth',
        realm: 'demo',
        clientId: 'demo-app'
    };

    const keycloak = Keycloak(kcConfig);

    keycloak.init({onLoad: 'login-required'}).then(authenticated => {

        if (authenticated) {

            const token = keycloak.token;
            const apiEndpoint = 'http://localhost:8081/api/endpoint';

            fetch(apiEndpoint, {
              headers: {
                'Authorization': 'Bearer ' + token
              }
            })
            .then(response => response.json())
            .then(data => console.log(data));

        }

    });

</script>
</head>
<body>
</body>
</html>

结论

本文介绍了如何在Keycloak中创建Realm、客户端和用户,以及如何配置回调URL和重定向URI以进行身份验证。还演示了如何使用Java和JavaScript中的Keycloak API进行身份验证和调用Keycloak保护的API。

本文链接:http://task.lmcjl.com/news/3371.html

展开阅读全文