Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/34.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js &引用;500错误:无法在仅持票人模式下为授权交换代码;在KeyClope中成功登录浏览器后_Node.js_Oauth 2.0_Authorization_Openid Connect_Keycloak - Fatal编程技术网

Node.js &引用;500错误:无法在仅持票人模式下为授权交换代码;在KeyClope中成功登录浏览器后

Node.js &引用;500错误:无法在仅持票人模式下为授权交换代码;在KeyClope中成功登录浏览器后,node.js,oauth-2.0,authorization,openid-connect,keycloak,Node.js,Oauth 2.0,Authorization,Openid Connect,Keycloak,试图通过反向代理访问浏览器中的/hello url的用户 “500错误:无法在仅承载模式下为授权交换代码” 用户在访问受保护url的KeyClope登录页面上成功登录后弹出错误 以下代码用于反向代理: var Keycloak = require('keycloak-connect'); var session = require('express-session'); var memoryStore = new session.MemoryStore(); let keycloak = ne

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

“500错误:无法在仅承载模式下为授权交换代码”

用户在访问受保护url的KeyClope登录页面上成功登录后弹出错误

以下代码用于反向代理:

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' ));
keydape.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"
  }
}
客户端测试界面是保密的。 将
bearer only:true
添加到keydape.json会导致拒绝访问错误,而不是上述错误


配置有什么问题吗?

首先:您的
keydeport.json
config和node.js
keydeport.protect
app代码未对齐:

  • keydape.json
    描述了
    领域“:“主”
  • 但您正在应用程序的
    GET/hello
    资源上调用
    keydeport.protection
    ,仅用于
    admin
    领域:
    app.GET('/hello',keydeport.protect('realm:admin')
尝试将领域更改为MASTER
app.get('/hello',keybeapt.protect('realm:master')

您可以使用cURL测试它是否有效 别忘了在KeyClope上设置承载身份验证

先拿你的持票人代币 现在,文学 这里发生的事情本质上是:

  • 在您的第一个请求中:您试图访问需要承载令牌身份验证的功能,但您使用的是授权交换代码。因此出现了错误500响应。为了获得该领域的有效承载令牌,您是否首先使用您的用户凭据对您的keydape
    /auth
    身份验证服务端点进行身份验证?或者相反,您是否错误地试图使用您的用户凭据直接针对应用程序的服务
    GET/hello
    API资源端点进行身份验证

  • 然后,在第二个请求中,您尝试启用仅承载身份验证,但:

  • 您的客户端没有检查提供的响应WWW Authenticate标头以确定所需的身份验证方法,最重要的是:
  • 您的客户端没有发出新的
    GET/hello
    请求,该请求提供了有效的HTTP
    授权
    头,其中包含您获得的对
    GET/hello
    的分配域有效的承载令牌
    。因此,您只需得到一个HTTP身份验证错误响应(通常是
    401未经授权的
    HTTP响应,尽管
    403被禁止
简言之,您需要在客户端和应用程序服务器以及身份验证服务器配置上对齐领域和身份验证方案,以便:

  • 您的应用服务器端点
    GET/hello
    将发送
    WWW-Authenticate
    HTTP头,指定所需的用户域和身份验证方案

  • 然后,您的客户端将使用提供的用户凭据在您的KeyClope身份验证服务器上进行身份验证,并接收承载令牌

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

  • 最后,对该领域和身份验证方案执行此操作后,您的客户端将能够向您的应用程序服务器发出一个
    GET/hello
    请求,该请求包含在HTTP
    Authorization
    头上获取的HTTP承载令牌。卷曲示例:

    curl-i-H“授权:无记名mytoken123”

有关更多信息:

  • 作为OAuth 2.0标准的一部分,OAuth 2.0承载令牌使用中描述了承载身份验证流

  • 描述如何在
    keydove.json
    上设置承载令牌身份验证

  • GET/hello
    resource(您可能希望使用自定义处理程序)

  • 预定义的KeyClope(类似于管理范围)上的文档,以及如何为应用程序的用户定义用户范围


你好!实用解决方案示例:更改领域、应用程序代码和cURL示例。可靠来源:官方keydape文档,oAuth RFC。我还编辑了我的答案,以使解决问题所需的步骤更易于理解。再看一眼。
curl -i http://YOUR_APP_SERVER_HOST/hello -H "Authorization: Bearer YOUR_BEARER_TOKEN"
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'