keycloak: 未识别的字段 “access_token”

huangapple go评论85阅读模式
英文:

keycloak : Unrecognized field "access_token"

问题

我有一个关于Keycloak管理客户端的问题。

当我尝试执行以下操作时:

  1. // 创建Keycloak客户端
  2. Keycloak keycloak = KeycloakBuilder.builder()
  3. .serverUrl(keycloakUrlAuth)
  4. .realm(keycloakRealm)
  5. .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
  6. .clientId(keycloakClientId)
  7. .clientSecret(keycloakClientSecret)
  8. .build();
  9. // 获取访问令牌
  10. AccessTokenResponse token = keycloak.tokenManager().getAccessToken();
  11. return token.getToken();

我总是收到以下错误:

  1. [来源: (org.jboss.resteasy.client.jaxrs.internal.ClientResponse$InputStreamWrapper); 行: 1, 列: 18] (通过引用链: org.keycloak.representations.AccessTokenResponse["access_token"]): javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: 未识别的字段 "access_token" (类 org.keycloak.representations.AccessTokenResponse),未标记为可忽略的字段 (已知属性: "tokenType", "notBeforePolicy", "otherClaims", "token", "sessionState", "refreshExpiresIn", "scope", "expiresIn", "refreshToken", "idToken"])
  2. docker-jboss-1 | [来源: (org.jboss.resteasy.client.jaxrs.internal.ClientResponse$InputStreamWrapper); 行: 1, 列: 18] (通过引用链: org.keycloak.representations.AccessTokenResponse["access_token"])
  3. docker-jboss-1 | org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:138)
  4. docker-jboss-1 | org.jboss.resteasy.client.jaxrs.internal.proxy.extractors.BodyEntityExtractor.extractEntity(BodyEntityExtractor.java:60)
  5. docker-jboss-1 | org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:104)
  6. docker-jboss-1 | org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
  7. docker-jboss-1 | com.sun.proxy.$Proxy519.grantToken(Unknown Source)
  8. docker-jboss-1 | org.keycloak.admin.client.token.TokenManager.grantToken(TokenManager.java:99)
  9. docker-jboss-1 | org.keycloak.admin.client.token.TokenManager.getAccessToken(TokenManager.java:75)

以下是我的pom.xml:

  1. <properties>
  2. <jackson-version>2.13.3</jackson-version>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. </properties>
  5. <dependency>
  6. <groupId>javax</groupId>
  7. <artifactId>javaee-api</artifactId>
  8. <version>7.0</version>
  9. <scope>provided</scope>
  10. </dependency>
  11. <!-- 其他依赖,包括Keycloak和Jackson相关的依赖 -->

以及我们使用的jboss-deployment-structure(我们排除了一些模块以使用新版本的Jackson - 需要用于OpenAPI):

  1. <jboss-deployment-structure>
  2. <deployment>
  3. <dependencies>
  4. <system export="true">
  5. <paths>
  6. <path name="sun/reflect"/>
  7. </paths>
  8. </system>
  9. </dependencies>
  10. <exclusions>
  11. <module name="org.dom4j"/>
  12. <module name="com.fasterxml.jackson.core.jackson-core"/>
  13. <module name="com.fasterxml.jackson.core.jackson-annotations"/>
  14. <module name="com.fasterxml.jackson.core.jackson-databind"/>
  15. <module name="com.fasterxml.jackson.datatype.jackson-datatype-jdk8"/>
  16. <module name="com.fasterxml.jackson.datatype.jackson-datatype-jsr310"/>
  17. <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider"/>
  18. <module name="org.jboss.resteasy.resteasy-jackson2-provider"/>
  19. <module name="org.jboss.resteasy.resteasy-jackson-provider"/>
  20. </exclusions>
  21. </deployment>
  22. </jboss-deployment-structure>

我已经尝试了很多方法,更改版本,排除依赖项,但都不起作用:(

有人能帮助我吗?

谢谢!

英文:

I've a problem with the keycloak admin client.

When I try to do :

  1. // Cr&#233;ation d&#39;un client Keycloak
  2. Keycloak keycloak = KeycloakBuilder.builder()
  3. .serverUrl(keycloakUrlAuth)
  4. .realm(keycloakRealm)
  5. .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
  6. .clientId(keycloakClientId)
  7. .clientSecret(keycloakClientSecret)
  8. .build();
  9. // Obtention du token d&#39;acc&#232;s
  10. AccessTokenResponse token = keycloak.tokenManager().getAccessToken();
  11. return token.getToken();

I always get this error :

  1. at [Source: (org.jboss.resteasy.client.jaxrs.internal.ClientResponse$InputStreamWrapper); line: 1, column: 18] (through reference chain: org.keycloak.representations.AccessTokenResponse[&quot;access_token&quot;]): javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field &quot;access_token&quot; (class org.keycloak.representations.AccessTokenResponse), not marked as ignorable (10 known properties: &quot;tokenType&quot;, &quot;notBeforePolicy&quot;, &quot;otherClaims&quot;, &quot;token&quot;, &quot;sessionState&quot;, &quot;refreshExpiresIn&quot;, &quot;scope&quot;, &quot;expiresIn&quot;, &quot;refreshToken&quot;, &quot;idToken&quot;])
  2. docker-jboss-1 | at [Source: (org.jboss.resteasy.client.jaxrs.internal.ClientResponse$InputStreamWrapper); line: 1, column: 18] (through reference chain: org.keycloak.representations.AccessTokenResponse[&quot;access_token&quot;])
  3. docker-jboss-1 | at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:138)
  4. docker-jboss-1 | at org.jboss.resteasy.client.jaxrs.internal.proxy.extractors.BodyEntityExtractor.extractEntity(BodyEntityExtractor.java:60)
  5. docker-jboss-1 | at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:104)
  6. docker-jboss-1 | at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
  7. docker-jboss-1 | at com.sun.proxy.$Proxy519.grantToken(Unknown Source)
  8. docker-jboss-1 | at org.keycloak.admin.client.token.TokenManager.grantToken(TokenManager.java:99)
  9. docker-jboss-1 | at org.keycloak.admin.client.token.TokenManager.getAccessToken(TokenManager.java:75)

Here is my pom.xml :

  1. &lt;properties&gt;
  2. &lt;jackson-version&gt;2.13.3&lt;/jackson-version&gt;
  3. &lt;project.build.sourceEncoding&gt;UTF-8&lt;/project.build.sourceEncoding&gt;
  4. &lt;/properties&gt;
  5. &lt;dependency&gt;
  6. &lt;groupId&gt;javax&lt;/groupId&gt;
  7. &lt;artifactId&gt;javaee-api&lt;/artifactId&gt;
  8. &lt;version&gt;7.0&lt;/version&gt;
  9. &lt;scope&gt;provided&lt;/scope&gt;
  10. &lt;/dependency&gt;
  11. &lt;dependency&gt;
  12. &lt;groupId&gt;org.jboss.resteasy&lt;/groupId&gt;
  13. &lt;artifactId&gt;resteasy-jaxrs&lt;/artifactId&gt;
  14. &lt;version&gt;3.0.26.Final-redhat-1&lt;/version&gt;
  15. &lt;scope&gt;provided&lt;/scope&gt;
  16. &lt;/dependency&gt;
  17. &lt;dependency&gt;
  18. &lt;groupId&gt;org.jboss.resteasy&lt;/groupId&gt;
  19. &lt;artifactId&gt;resteasy-cdi&lt;/artifactId&gt;
  20. &lt;version&gt;3.0.26.Final-redhat-1&lt;/version&gt;
  21. &lt;scope&gt;provided&lt;/scope&gt;
  22. &lt;/dependency&gt;
  23. &lt;dependency&gt;
  24. &lt;groupId&gt;org.jboss.resteasy&lt;/groupId&gt;
  25. &lt;artifactId&gt;resteasy-multipart-provider&lt;/artifactId&gt;
  26. &lt;version&gt;3.0.26.Final-redhat-1&lt;/version&gt;
  27. &lt;scope&gt;provided&lt;/scope&gt;
  28. &lt;/dependency&gt;
  29. &lt;dependency&gt;
  30. &lt;groupId&gt;org.jboss.resteasy&lt;/groupId&gt;
  31. &lt;artifactId&gt;resteasy-cache-core&lt;/artifactId&gt;
  32. &lt;version&gt;3.1.4.Final&lt;/version&gt;
  33. &lt;/dependency&gt;
  34. &lt;dependency&gt;
  35. &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
  36. &lt;artifactId&gt;jackson-core&lt;/artifactId&gt;
  37. &lt;version&gt;${jackson-version}&lt;/version&gt;
  38. &lt;/dependency&gt;
  39. &lt;dependency&gt;
  40. &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
  41. &lt;artifactId&gt;jackson-databind&lt;/artifactId&gt;
  42. &lt;version&gt;${jackson-version}&lt;/version&gt;
  43. &lt;/dependency&gt;
  44. &lt;dependency&gt;
  45. &lt;groupId&gt;com.fasterxml.jackson.core&lt;/groupId&gt;
  46. &lt;artifactId&gt;jackson-annotations&lt;/artifactId&gt;
  47. &lt;version&gt;${jackson-version}&lt;/version&gt;
  48. &lt;/dependency&gt;
  49. &lt;dependency&gt;
  50. &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
  51. &lt;artifactId&gt;jackson-jaxrs-base&lt;/artifactId&gt;
  52. &lt;version&gt;${jackson-version}&lt;/version&gt;
  53. &lt;/dependency&gt;
  54. &lt;dependency&gt;
  55. &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
  56. &lt;artifactId&gt;jackson-jaxrs-json-provider&lt;/artifactId&gt;
  57. &lt;version&gt;${jackson-version}&lt;/version&gt;
  58. &lt;/dependency&gt;
  59. &lt;dependency&gt;
  60. &lt;groupId&gt;com.fasterxml.jackson.module&lt;/groupId&gt;
  61. &lt;artifactId&gt;jackson-module-jaxb-annotations&lt;/artifactId&gt;
  62. &lt;version&gt;${jackson-version}&lt;/version&gt;
  63. &lt;/dependency&gt;
  64. &lt;dependency&gt;
  65. &lt;groupId&gt;com.fasterxml.jackson.datatype&lt;/groupId&gt;
  66. &lt;artifactId&gt;jackson-datatype-jsr310&lt;/artifactId&gt;
  67. &lt;version&gt;${jackson-version}&lt;/version&gt;
  68. &lt;/dependency&gt;
  69. &lt;dependency&gt;
  70. &lt;groupId&gt;org.jboss.resteasy&lt;/groupId&gt;
  71. &lt;artifactId&gt;resteasy-jackson2-provider&lt;/artifactId&gt;
  72. &lt;version&gt;3.0.26.Final-redhat-1&lt;/version&gt;
  73. &lt;exclusions&gt;
  74. &lt;exclusion&gt;
  75. &lt;groupId&gt;com.fasterxml.jackson.jaxrs&lt;/groupId&gt;
  76. &lt;artifactId&gt;jackson-jaxrs-json-provider&lt;/artifactId&gt;
  77. &lt;/exclusion&gt;
  78. &lt;/exclusions&gt;
  79. &lt;/dependency&gt;
  80. &lt;dependency&gt;
  81. &lt;groupId&gt;org.keycloak&lt;/groupId&gt;
  82. &lt;artifactId&gt;keycloak-core&lt;/artifactId&gt;
  83. &lt;version&gt;20.0.5&lt;/version&gt;
  84. &lt;/dependency&gt;
  85. &lt;dependency&gt;
  86. &lt;groupId&gt;org.keycloak&lt;/groupId&gt;
  87. &lt;artifactId&gt;keycloak-adapter-core&lt;/artifactId&gt;
  88. &lt;version&gt;20.0.5&lt;/version&gt;
  89. &lt;/dependency&gt;
  90. &lt;dependency&gt;
  91. &lt;groupId&gt;org.keycloak&lt;/groupId&gt;
  92. &lt;artifactId&gt;keycloak-admin-client&lt;/artifactId&gt;
  93. &lt;version&gt;20.0.5&lt;/version&gt;
  94. &lt;/dependency&gt;

And the jboss-deployment-structure we use (we exclude some modules to be able to use a newer version of jackson - need for openapi) :

  1. &lt;jboss-deployment-structure&gt;
  2. &lt;deployment&gt;
  3. &lt;dependencies&gt;
  4. &lt;system export=&quot;true&quot;&gt;
  5. &lt;paths&gt;
  6. &lt;path name=&quot;sun/reflect&quot;/&gt;
  7. &lt;/paths&gt;
  8. &lt;/system&gt;
  9. &lt;/dependencies&gt;
  10. &lt;exclusions&gt;
  11. &lt;module name=&quot;org.dom4j&quot;/&gt;
  12. &lt;module name=&quot;com.fasterxml.jackson.core.jackson-core&quot;/&gt;
  13. &lt;module name=&quot;com.fasterxml.jackson.core.jackson-annotations&quot;/&gt;
  14. &lt;module name=&quot;com.fasterxml.jackson.core.jackson-databind&quot;/&gt;
  15. &lt;module name=&quot;com.fasterxml.jackson.datatype.jackson-datatype-jdk8&quot;/&gt;
  16. &lt;module name=&quot;com.fasterxml.jackson.datatype.jackson-datatype-jsr310&quot;/&gt;
  17. &lt;module name=&quot;com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider&quot;/&gt;
  18. &lt;module name=&quot;org.jboss.resteasy.resteasy-jackson2-provider&quot;/&gt;
  19. &lt;module name=&quot;org.jboss.resteasy.resteasy-jackson-provider&quot;/&gt;
  20. &lt;/exclusions&gt;
  21. &lt;/deployment&gt;
  22. &lt;/jboss-deployment-structure&gt;

I've tried a lot of things.. Changing the versions, exclude dependencies.. but nothing works keycloak: 未识别的字段 “access_token”

Could someone help me ?

Thank you

答案1

得分: 0

好的,以下是您要的翻译部分:

首先,我终于找到了一些有效的方法(但仍然不明白为什么它不像这样工作).. 这是我目前的解决方案:

首先,我扩展了NamingBase,以便能够重写字段的名称:

  1. public class CustomNaming extends PropertyNamingStrategies.NamingBase {
  2. public CustomNaming() {
  3. super();
  4. }
  5. @Override
  6. public String translate(String s) {
  7. switch (s) {
  8. case "token":
  9. return "access_token";
  10. case "expiresIn":
  11. return "expires_in";
  12. case "refreshExpiresIn":
  13. return "refresh_expires_in";
  14. case "refreshToken":
  15. return "refreshToken";
  16. case "tokenType":
  17. return "token_type";
  18. case "idToken":
  19. return "id_token";
  20. case "notBeforePolicy":
  21. return "not-before-policy";
  22. case "sessionState":
  23. return "session_state";
  24. case "errorDescription":
  25. return "error_description";
  26. case "errorUri":
  27. return "error_uri";
  28. default:
  29. return s;
  30. }
  31. }
  32. }

然后,我还扩展了ResteasyJackson2Provider,以使用自定义的命名策略和对象映射器的其他属性:

  1. public class CustomRestEasyJackson2Provider extends ResteasyJackson2Provider {
  2. public CustomRestEasyJackson2Provider() {
  3. super();
  4. ObjectMapper mapper = new ObjectMapper();
  5. mapper.registerModule(new JavaTimeModule());
  6. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  7. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  8. mapper.setPropertyNamingStrategy(new CustomNaming());
  9. setMapper(mapper);
  10. }
  11. }

最后,我在KeycloakBuilder中使用它:

  1. Keycloak keycloak = KeycloakBuilder.builder()
  2. .serverUrl(keycloakUrlAuth)
  3. .realm(keycloakRealm)
  4. .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
  5. .clientId(keycloakClientId)
  6. .clientSecret(keycloakClientSecret)
  7. .resteasyClient(new ResteasyClientBuilder()
  8. .register(new CustomRestEasyJackson2Provider(), 1000)
  9. .build())
  10. .build();

这样,它就能够正常工作!

英文:

Well, I finally found something that works (but still don't understand why it doesn't work like that).. Here is my solution for now :

First, I've extended de NamingBase to be able to override de names of the fields :

  1. public class CustomNaming extends PropertyNamingStrategies.NamingBase {
  2. public CustomNaming() {
  3. super();
  4. }
  5. @Override
  6. public String translate(String s) {
  7. switch (s) {
  8. case &quot;token&quot;:
  9. return &quot;access_token&quot;;
  10. case &quot;expiresIn&quot;:
  11. return &quot;expires_in&quot;;
  12. case &quot;refreshExpiresIn&quot;:
  13. return &quot;refresh_expires_in&quot;;
  14. case &quot;refreshToken&quot;:
  15. return &quot;refreshToken&quot;;
  16. case &quot;tokenType&quot;:
  17. return &quot;token_type&quot;;
  18. case &quot;idToken&quot;:
  19. return &quot;id_token&quot;;
  20. case &quot;notBeforePolicy&quot;:
  21. return &quot;not-before-policy&quot;;
  22. case &quot;sessionState&quot;:
  23. return &quot;session_state&quot;;
  24. case &quot;errorDescription&quot;:
  25. return &quot;error_description&quot;;
  26. case &quot;errorUri&quot;:
  27. return &quot;error_uri&quot;;
  28. default:
  29. return s;
  30. }
  31. }
  32. }

Then, I've also extended de ResteasyJackson2Provider to use that customNaming and other properties in the objectMapper :

  1. public class CustomRestEasyJackson2Provider extends ResteasyJackson2Provider {
  2. public CustomRestEasyJackson2Provider() {
  3. super();
  4. ObjectMapper mapper = new ObjectMapper();
  5. mapper.registerModule(new JavaTimeModule());
  6. mapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
  7. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  8. mapper.setPropertyNamingStrategy(new CustomNaming());
  9. setMapper(mapper);
  10. }
  11. }

And finally, I use it in the KeycloakBuilder :

  1. Keycloak keycloak = KeycloakBuilder.builder()
  2. .serverUrl(keycloakUrlAuth)
  3. .realm(keycloakRealm)
  4. .grantType(OAuth2Constants.CLIENT_CREDENTIALS)
  5. .clientId(keycloakClientId)
  6. .clientSecret(keycloakClientSecret)
  7. .resteasyClient(new ResteasyClientBuilder()
  8. .register(new CustomRestEasyJackson2Provider(), 1000)
  9. .build())
  10. .build();

Like that, it works !

huangapple
  • 本文由 发表于 2023年2月26日 22:43:58
  • 转载请务必保留本文链接:https://go.coder-hub.com/75572737.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定