错误 org.keycloak.adapters.OAuthRequestAuthenticator - 无法将代码转换为令牌

Posted

技术标签:

【中文标题】错误 org.keycloak.adapters.OAuthRequestAuthenticator - 无法将代码转换为令牌【英文标题】:ERROR org.keycloak.adapters.OAuthRequestAuthenticator - failed to turn code into token 【发布时间】:2020-04-14 13:39:21 【问题描述】:

我们的应用程序、nginx 和 keycloak 存在问题。有 3 个实例:实例 1 APP、实例 2 NGINX(反向代理)和实例 3 Keycloak。

当用户登录时,他在 keycloak 中创建会话,但当他返回 SiAe 应用程序时,他返回 403。 我们进入 keycloak 管理控制台,看到会话成功并打开。但是返回应用程序是不可能的。

日志

Nginx:

    "GET /opensat/?state=dcc1c40f-3183-4c7b-8342-f7df620cf0b3&session_state=605ba79a-ee05-4918-a96d-71466e31210a&code=fe066a17-a97a-495c-94f9-b1e5e3d6ac1f.605ba79a-ee05-4918-a96d-71466e31210a.f91920a4-3267-4de5-9788-24093a32c217 HTTP/1.1" **403 405** "https://mydomain/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:71.0) Gecko/20100101 Firefox/71.0"

应用程序:

ERROR org.keycloak.adapters.OAuthRequestAuthenticator  - failed to turn code into token
java.net.SocketException: Connection reset
        at java.net.SocketInputStream.read(SocketInputStream.java:196)
        at java.net.SocketInputStream.read(SocketInputStream.java:122)
        at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
        at sun.security.ssl.InputRecord.read(InputRecord.java:480)
        at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
        at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
        at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
        at org.apache.http.conn.ssl.SSLSocketFactory.createLayeredSocket(SSLSocketFactory.java:573)
        at org.keycloak.adapters.SniSSLSocketFactory.createLayeredSocket(SniSSLSocketFactory.java:114)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:557)
        at org.keycloak.adapters.SniSSLSocketFactory.connectSocket(SniSSLSocketFactory.java:109)
        at org.apache.http.conn.ssl.SSLSocketFactory.connectSocket(SSLSocketFactory.java:414)
        at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:180)

钥匙斗篷:

**INFO** [org.keycloak.storage.ldap.LDAPIdentityStoreRegistry] (default task-1) Creating new LDAP Store for the LDAP storage provider: 'ldap_pre', LDAP Configuration: pagination=[true], fullSyncPeriod=[-1], usersDn=[ou=usuarios,dc=domain,dc=es], connectionPooling=[true], cachePolicy=[DEFAULT], useKerberosForPasswordAuthentication=[false], importEnabled=[true], enabled=[true], changedSyncPeriod=[86400], bindDn=[cn=admin,dc=domain,dc=es], usernameLDAPAttribute=[uid], lastSync=[1575269470], vendor=[other], uuidLDAPAttribute=[entryUUID], connectionUrl=[ldap://MIIP:389], allowKerberosAuthentication=[false], syncRegistrations=[false], authType=[simple], debug=[false], searchScope=[1], useTruststoreSpi=[ldapsOnly], priority=[0], userObjectClasses=[inetOrgPerson, organizationalPerson, person], rdnLDAPAttribute=[cn], editMode=[WRITABLE], validatePasswordPolicy=[false], batchSizeForSync=[1000], binaryAttributes: []

配置:

Nginx:

location / 

        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Server $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host   $host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_pass http://IP_KEYCLOAK:8081;

钥匙斗篷:

     ....
        <server name="default-server">
                <http-listener name="default" socket-binding="http" redirect-socket="proxyhttps" proxy-address-forwarding="true" enable-http2="true"/>
     ......
             <socket-binding name="proxy-https" port="443"/>
     .....

APP.json:


  "realm": "domain",
  "auth-server-url": "https://domainkeycloak/",
  "ssl-required": "none",
  "resource": "sso",
  "enable-cors" : true,
  "credentials": 
    "secret": "98236f9a-c8b1-488c-8b36-ace4f95b1aa6"
  ,
  "confidential-port": 0,
  "disable-trust-manager":true,
  "allow-any-hostname" : true

有人可以帮助我们吗?

【问题讨论】:

您的 APP 中的异常是否提供更长的 stracktrace(例如,更多信息,CAUSED BY 可能?) - 当应用程序尝试连接到 keycloak 以交换临时文件时,似乎存在问题带有 access_token 的密钥 不,它没有。结束如下:..... at java.lang.Thread.run(Thread.java:745) 2019-12-23 14:29:24,811 localhost-startStop-2 ERROR 【参考方案1】:

错误Connection reset 表示应用程序无法向 Keycloak 服务器发出请求。由于您将auth-server-url 设置为https://domainkeycloak/,因此您应该通过使用443 端口登录应用程序服务器和telnet keycloak 域来进一步调查此问题

【讨论】:

您好!感谢您的回复,但配置 auth-server-url 正常:"auth-server-url": "https://midomain.com/auth" 我们在本地有相同的配置并且运行正常,但 AWS 上的此配置没有不运行。【参考方案2】:

解决方案已经将keycloak与其他Nginx分开,而不是使用一个Nginx for APP和Keycloak。现在,我们有 2 个 Nginx 并使用我们的 APP 运行 OK keycloak。

【讨论】:

以上是关于错误 org.keycloak.adapters.OAuthRequestAuthenticator - 无法将代码转换为令牌的主要内容,如果未能解决你的问题,请参考以下文章

Wicket - Keyclock 隐藏 org.keycloak.adapters 调试日志(logback)

Keycloak 验证错误

Keycloak 状态参数无效

Keycloak REST API 无法从用户角色映射中删除客户端级角色

远程服务器返回错误: 404错误远程服务器返回错误:500错误 HttpWebResponse远程服务器返回错误:(404500) 错误。

Pig 安装错误:错误 pig.Main:错误 2998:未处理的内部错误