本文正在参加「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
}
回答二
-
在
keycloak / themes /目录中,创建名称为的文件夹。myTheme。 -
在
myTheme文件夹中,放置您的自定义登录页面 (结构必须与基本主题或密钥主题相同,我的建议是复制基本主题,对其重命名并对其进行自定义)。 -
进入
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以及AccessToken和RefreshToken一起提供。
否则response.getStatusLine().getStatusCode()将给出值HTTP 403和数据为:{"error":"invalid_grant","error_description":"Invalid user credentials"}
文章翻译自Stack Overflow :stackoverflow.com/questions/3…