用户试图通过反向代理访问浏览器中的/hello url。
"500错误:不能在只承载模式下交换授予代码“
在访问受保护的url时,用户在Keycloak登录页面上成功登录后会弹出错误。
在反向代理中使用以下代码:
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是:
{
"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将导致访问拒绝错误,而不是上述错误。
配置有什么问题吗?
发布于 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是否有效
curl -i http://YOUR_APP_SERVER_HOST/hello -H "Authorization: Bearer YOUR_BEARER_TOKEN"不要忘记在KEYCLOAK上设置无记名身份验证
services/topics/enforcer/keycloak-enforcement-bearer.html
先把你的信物拿来
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'现在,文学
这里发生的事情本质上是:
/auth身份验证服务端点进行身份验证,以获得该领域的有效标记?或者,相反,您是否错误地试图使用您的用户凭据来直接对您的应用程序的服务GET /hello API资源端点进行身份验证?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服务器管理控制台。
GET /hello请求,其中包含HTTP Authorization报头上获得的HTTP令牌。cURL示例:
curl -i http://example.com/api/hello -H“授权:无记名mytoken123”有关详细信息,请访问:
keycloak.json上设置承载令牌身份验证。GET /hello资源(您可能希望使用自定义处理程序)。https://stackoverflow.com/questions/52541827
复制相似问题