1.22 避免使用keycloak默认登录页面,而使用项目登录页面 | Java Debug 笔记

1,671 阅读2分钟

本文正在参加「Java主题月 - Java Debug笔记活动」,详情查看 活动链接

Debug 笔记 <避免使用keycloak默认登录页面,而使用项目登录页面 >

提问

我正在创建一个angular.js Web应用程序,并正在寻找如何集成keycloak到该项目中。我已经阅读并观看了许多教程,并且看到其中大多数教程都让用户通过默认登录页面进行登录/注册keycloak,然后将其重定向到该应用程序。

我设计了自己的登录和注册页面,我想使用它。

我如何使用它们而不是keycloak默认值。有没有可以调用的API,或者后端可以做到这一点?

我的第二个问题是在注册时可以在其中添加更多用户详细信息,例如地址,地址,性别keycloak吗?

因为我的注册页面需要这些信息。

回答一

扩展API

POST to your/keycloak/url/auth/realms/master/protocol/openid-connect/token

与数据:

{

    client_id : 'Id_of_your_client',

    username : 'your_username',
    password : '@#$%^&',
    grant_type : "password"

}

将为您提供初始访问令牌刷新令牌

用以下命令发布到相同的URL

{

    client_id : 'Id_of_your_client',

   // client_secret : 'optional depending on the type of client',

    grant_type : "refresh_token" ,

    refresh_token : refresh_token_you_got_earlier 

}

将提供新的刷新和访问令牌。这些令牌是密钥斗篷检查授权/身份验证的内容。 您可以进行自己的登录,然后通过REST API将凭据发送到keycloak,一旦获得了访问令牌,只需将其放置在对keycloak保护的资源的任何正在进行的请求的标头中,如下所示:

headers :{

  Authorization : 'Bearer ' +  access_token_you_got

}

回答二

  1. keycloak / themes / 目录中,创建名称为的文件夹。myTheme

  2. myTheme文件夹中,放置您的自定义登录页面 (结构必须与基本主题或密钥主题相同,我的建议是复制基本主题,对其重命名并对其进行自定义)。

  3. 进入keycloak的管理控制台,进入“领域设置”>“主题”>“登录主题”,然后选择“ myTheme”

回答三

如果要通过Java访问Keycloak登录页面并获取响应,请使用以下代码:

String uri = "http://localhost:7080/auth/realms/{RealmName}/protocol/openid-connect/token";

            HttpClient client = HttpClientBuilder.create().build();
            HttpPost post = new HttpPost(uri);
            post.setHeader("User-Agent",
                    "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36");
            List<BasicNameValuePair> urlParameters = new ArrayList<BasicNameValuePair>();
            urlParameters.add(new BasicNameValuePair("grant_type", "password"));
            urlParameters.add(new BasicNameValuePair("client_id", {ClientName}));
            urlParameters.add(new BasicNameValuePair("username", {UserName}));
            urlParameters.add(new BasicNameValuePair("password", {Password}));
            post.setEntity(new UrlEncodedFormEntity(urlParameters));
            HttpResponse response = client.execute(post);
            System.out.println("Response Code : " + response.getStatusLine().getStatusCode());
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            StringBuffer result = new StringBuffer();
            String line1 = "";
            while ((line1 = rd.readLine()) != null) {
                result.append(line1);
            }
            System.out.println(result);

如果您的用户名和密码有效,response.getStatusLine().getStatusCode()则将值HTTP 200以及AccessTokenRefreshToken一起提供。

否则response.getStatusLine().getStatusCode()将给出值HTTP 403和数据为:{"error":"invalid_grant","error_description":"Invalid user credentials"}

文章翻译自Stack Overflow :stackoverflow.com/questions/3…