Я пытаюсь следовать этому уроку jwt plus keycloack hello world , чтобы авторизовать мои остальные конечные точки с помощью JWT-микропрофиля и keycloack.
Прежде всего, я настроил keycloack. Я создал группы, роли, сопоставил роли, поэтому, когда я делаю запрос от почтальона к http://localhost:8080/auth/realms/public/protocol/openid-connect/token, в разделе токена доступа, я получаю следующий токен (отформатированный из jwt.io):
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJTelY5d3J3aGtid1ZHS1drSGd2V2N4SXFNM2pMaGliUGI5cG5LWEdudWxNIn0.eyJqdGkiOiJiZWMyZjM4Zi1jNzVlLTQ1NDctYTVmNy1mOGI4MWQwYjI5YmQiLCJleHAiOjE1NzA5NjAxNTEsIm5iZiI6MCwiaWF0IjoxNTcwOTU5ODUxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvcHVibGljIiwiYXVkIjoiYWNjb3VudCIsInN1YiI6IjFhZWM1YWJmLTk2OWUtNGM0NS1hMzJjLTNhZmY3ZDcyZjk2YSIsInR5cCI6IkJlYXJlciIsImF6cCI6Im1pY3JvcHJvZmlsZS1qd3QtY2xpZW50IiwiYXV0aF90aW1lIjowLCJzZXNzaW9uX3N0YXRlIjoiMmRiNWRmZWYtNWFiZC00NTYwLWIyNjUtOTg5MGM3Y2Q2YWU2IiwiYWNyIjoiMSIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJteXNpbXBsZXJvbGUiLCJyb2xlMSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsImdyb3VwcyI6WyJteXNpbXBsZXJvbGUiLCJyb2xlMSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXSwicHJlZmVycmVkX3VzZXJuYW1lIjoibWljcm9wcm9maWxlLWp3dC11c2VyIn0.MOE-a2koGFDiOb3MuPGXkPu9YyawC4ZpvsrCsgWXKN71GZWKBaF-EXcA1V05YNniRdo4qoYzIfJFSzTJgEIWF3La3ft_I0D-huv3i7Vgw-bafLvfVwkRZlUHbxZfJoWVl-O7NmDFWS4Z9O8YQzkhqEXYFJTejDmR_fbd5FNzGLxZ4EyFMT8ViR-j9bWIdTN50_KiauKPsEpY0vzZ5-YZaQXqvDusa1Xj2eYR2X-d2cWMUgLetArSONxjaDalg-5aqmVKhJMZsMiRLW0Cxh5-FhqnTipvAbTiKLVuBurFPAE0nPhgnzWjSIzA6uNLWFLsrox7p7sZg_TUrMrkdKjXNg",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICI1OTQxZjZkNS0yMjQ1LTQ4YTQtODJhNy1iMjM1MjM5NmFmYTQifQ.eyJqdGkiOiJhYjVhZTQ0Mi0wOWZkLTQ5ZDEtOGUzYS0wOWE2ODA1ODk4MDIiLCJleHAiOjE1NzA5NjE2NTEsIm5iZiI6MCwiaWF0IjoxNTcwOTU5ODUxLCJpc3MiOiJodHRwOi8vbG9jYWxob3N0OjgwODAvYXV0aC9yZWFsbXMvcHVibGljIiwiYXVkIjoiaHR0cDovL2xvY2FsaG9zdDo4MDgwL2F1dGgvcmVhbG1zL3B1YmxpYyIsInN1YiI6IjFhZWM1YWJmLTk2OWUtNGM0NS1hMzJjLTNhZmY3ZDcyZjk2YSIsInR5cCI6IlJlZnJlc2giLCJhenAiOiJtaWNyb3Byb2ZpbGUtand0LWNsaWVudCIsImF1dGhfdGltZSI6MCwic2Vzc2lvbl9zdGF0ZSI6IjJkYjVkZmVmLTVhYmQtNDU2MC1iMjY1LTk4OTBjN2NkNmFlNiIsInJlYWxtX2FjY2VzcyI6eyJyb2xlcyI6WyJteXNpbXBsZXJvbGUiLCJyb2xlMSIsIm9mZmxpbmVfYWNjZXNzIiwidW1hX2F1dGhvcml6YXRpb24iXX0sInJlc291cmNlX2FjY2VzcyI6eyJhY2NvdW50Ijp7InJvbGVzIjpbIm1hbmFnZS1hY2NvdW50IiwibWFuYWdlLWFjY291bnQtbGlua3MiLCJ2aWV3LXByb2ZpbGUiXX19LCJzY29wZSI6ImVtYWlsIHByb2ZpbGUifQ.n6C-7ivJkKlmGo9PBt1GXyiXS3VFcxbozjcUcjYGRH8",
"token_type": "bearer",
"not-before-policy": 0,
"session_state": "2db5dfef-5abd-4560-b265-9890c7cd6ae6",
"scope": "email profile"
}
Раздел токена доступа, отформатированный из jwt.io:
{
"jti": "ce5e517e-549d-4bbe-8c00-790356e765cc",
"exp": 1570958586,
"nbf": 0,
"iat": 1570958286,
"iss": "http://localhost:8080/auth/realms/public",
"aud": "account",
"sub": "1aec5abf-969e-4c45-a32c-3aff7d72f96a",
"typ": "Bearer",
"azp": "microprofile-jwt-client",
"auth_time": 0,
"session_state": "a5a3ee14-f6fe-4972-a350-852dccb90a27",
"acr": "1",
"realm_access": {
"roles": [
"mysimplerole",
"role1",
"offline_access",
"uma_authorization"
]
},
"resource_access": {
"account": {
"roles": [
"manage-account",
"manage-account-links",
"view-profile"
]
}
},
"scope": "email profile",
"email_verified": false,
"groups": [
"mysimplerole",
"role1",
"offline_access",
"uma_authorization"
],
"preferred_username": "microprofile-jwt-user"
}
В моем проекте есть следующие файлы:
JAXRSConfiguration.java
package com.airhacks;
2
3 import javax.annotation.security.DeclareRoles;
4
5 import javax.ws.rs.ApplicationPath;
6 import javax.ws.rs.core.Application;
7
8 import org.eclipse.microprofile.auth.LoginConfig;
9
10 /**
11 * Configures a JAX-RS endpoint. Delete this class, if you are not exposing
12 * JAX-RS resources in your application.
13 *
14 * @author airhacks.com
15 */
16 @ApplicationPath("resources")
17 @LoginConfig(authMethod="MP-JWT")
18 @DeclareRoles({ "mysimplerole", "USER" })
1 public class JAXRSConfiguration extends Application {}
PingResource.java
1 package com.airhacks.ping.boundary;
2
3 import javax.annotation.security.PermitAll;
4 import javax.annotation.security.RolesAllowed;
5
6 import javax.inject.Inject;
7
8 import javax.ws.rs.GET;
9 import javax.ws.rs.Path;
10
11 import org.eclipse.microprofile.config.inject.ConfigProperty;
12
13 /**
14 *
15 * @author airhacks.com
16 */
17 @Path("ping")
18 public class PingResource {
19
20 //@Inject
21 //@ConfigProperty(name = "message")
22 String message;
23
24 @GET
25 @RolesAllowed("mysimplerole")
26 //@PermitAll
27 public String ping() {
28 return "Jakarta EE with MicroProfile 2+!";
29 }
30
31 }
~
microprofile-config.properties
-- message=Enjoy
mp.jwt.verify.publickey.location=http://localhost:8080/auth/realms/public/protocol/openid-connect/certs
mp.jwt.verify.issuer=http://localhost:8080/auth/realms/public
Я попытался вставить в свойство mp.jwt.verify.issuer непосредственно необработанный токен, но все еще не авторизованный. Я не знаю, чего не хватает.