首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"500错误:无法在承载模式下交换授予代码“成功地在密钥披风浏览器登录后

"500错误:无法在承载模式下交换授予代码“成功地在密钥披风浏览器登录后
EN

Stack Overflow用户
提问于 2018-09-27 16:55:40
回答 1查看 1.9K关注 0票数 3

用户试图通过反向代理访问浏览器中的/hello url。

"500错误:不能在只承载模式下交换授予代码“

在访问受保护的url时,用户在Keycloak登录页面上成功登录后会弹出错误。

在反向代理中使用以下代码:

代码语言:javascript
复制
var Keycloak = require('keycloak-connect');
var session = require('express-session');
var memoryStore = new session.MemoryStore();

let keycloak = new Keycloak(memoryStore);
app = express();
app.use( keycloak.middleware() );
app.get( '/hello', keycloak.protect( 'realm:admin' ));

keycloak.json是:

代码语言:javascript
复制
{
  "realm": "master",
  "auth-server-url": "https://127.0.0.1/auth",  
  "resource": "test_ui",
  "confidential-port": 0,  
  "credentials" : {
    "password" : "d31c4718-12e9-407b-9bf2-cb72734a23f0"
  }
}

客户端test_ui是保密的。将bearer-only : true添加到keycloak.json将导致访问拒绝错误,而不是上述错误。

配置有什么问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-10-07 14:55:42

首先:您的keycloak.json配置和node.js keycloak.protect应用程序代码是不对齐的:

  • keycloak.json描述"realm":"master"
  • 但是,您只是在应用程序的keycloak.protection资源上调用admin领域的admin资源:app.get( '/hello', keycloak.protect( 'realm:admin' ));

尝试将领域更改为掌握。

app.get( '/hello', keycloak.protect( 'realm:master' ));

您可以使用cURL测试IT是否有效

代码语言:javascript
复制
curl -i http://YOUR_APP_SERVER_HOST/hello -H "Authorization: Bearer YOUR_BEARER_TOKEN"

不要忘记在KEYCLOAK上设置无记名身份验证

services/topics/enforcer/keycloak-enforcement-bearer.html

先把你的信物拿来

代码语言:javascript
复制
curl \
  -d 'client_id=YOUR_KEYCLOAK_CLIENT' \
  -d 'username=YOUR_USERNAME' \
  -d 'password=YOUR_PASSWORD' \
  -d 'grant_type=password' \
  'https://YOUR_KEYCLOAK_SERVER_HOST/auth/realms/YOUR_REALM/protocol/openid-connect/token'

现在,文学

这里发生的事情本质上是:

  • 在您的第一个请求中:您正在尝试访问需要更多令牌身份验证的功能,但是您使用的是授予交换代码。因此出现了错误500响应。您是否首先使用用户凭据对密钥斗篷/auth身份验证服务端点进行身份验证,以获得该领域的有效标记?或者,相反,您是否错误地试图使用您的用户凭据来直接对您的应用程序的服务GET /hello API资源端点进行身份验证?
  • 然后,在第二个请求中,您尝试启用Bearer身份验证,但是:
代码语言:javascript
复制
1. Your client is not examining the provided response WWW-Authenticate header for determining the required authentication method and, most importantly:
2. **Your client is not issuing a new** **`GET /hello`** **request providing a valid HTTP** `Authorization` **header with your obtained Bearer token valid for** **`GET /hello`****'s assigned realm**. Therefore you simply get an HTTP authentication error response (Typically `401 Unauthorized` HTTP response, although `403 Forbidden` [is sometimes used instead](https://stackoverflow.com/questions/3297048/403-forbidden-vs-401-unauthorized-http-responses)).

简而言之,您需要在客户端和应用服务器以及auth服务器配置上对齐领域和auth方案,因此:

  • 您的应用服务器端点GET /hello将发送一个WWW-Authenticate HTTP报头,指定所需的用户域和身份验证方案。
  • 然后,您的客户端将使用所提供的用户凭据在您的keycloak身份验证服务器上进行身份验证,并接收更多令牌。

您必须已将keycloak身份验证服务器配置为支持该领域所需的身份验证方案,并且用户必须具有在该领域上操作的权限。为此目的,请查看keycloak服务器管理控制台。

  • 最后,一旦完成了该领域和身份验证方案,您的客户端将能够向您的应用服务器发出GET /hello请求,其中包含HTTP Authorization报头上获得的HTTP令牌。cURL示例: curl -i http://example.com/api/hello -H“授权:无记名mytoken123”

有关详细信息,请访问:

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52541827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档