keycloak-nodejs-connect:无法获取授权代码:400:错误请求

问题描述 投票:0回答:3

设置:

我正在尝试让 keycloak-connect 库的演示代码运行,但失败了。

这就是我所做的:

  • 下载并独立启动keycloak 4.7,设置管理员用户和密码
  • 创建一个基本的公共客户端
  • 创建用户
  • 在 webstorm 中创建一个基本的 Express 应用程序
  • 相关文件:

index.js

var createError = require('http-errors');


var express = require('express');
var path = require('path');
var cookieParser = require('cookie-parser');
var logger = require('morgan');

var session = require('express-session');
var Keycloak = require('keycloak-connect');

var memoryStore = new session.MemoryStore();

let keycloak = new Keycloak({ store: memoryStore });

var indexRouter = require('./routes/index');
var usersRouter = require('./routes/users');

var app = express();

app.set('trust proxy', 1); // trust first proxy
app.use(session({
    secret: 'keyboard cat',
    resave: false,
    saveUninitialized: true,
    cookie: { secure: true },
    store: memoryStore
}));

app.use( keycloak.middleware() );

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'pug');

app.use(logger('dev'));
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));


app.get('/$', function(req, res) {
    res.write('<a href="/secure">Secure</a>');
    res.end();
});

app.get( '/secure', keycloak.protect('realm:master'), function(req, res){
//Edit: keycloak.protect() gives the same result
    res.write("Yo!");
    res.end();
});

// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});

// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env') === 'development' ? err : {};

  // render the error page
  res.status(err.status || 500);
  res.render('error');
});

module.exports = app;

keycloak.json(复制/粘贴)

{
  "realm": "master",
  "auth-server-url": "http://localhost:8080/auth",
  "ssl-required": "external",
  "resource": "test",
  "public-client": true,
  "confidential-port": 0
}

package.json

{
  "name": "keycloak-test",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "node ./bin/www"
  },
  "dependencies": {
    "cookie-parser": "~1.4.3",
    "debug": "~2.6.9",
    "express": "~4.16.0",
    "express-session": "^1.15.6",
    "http-errors": "~1.6.2",
    "keycloak-connect": "^4.7.0",
    "morgan": "~1.9.0",
    "pug": "2.0.0-beta11"
  }
}

问题:

访问

http://localhost:3000/secure
时,我会被重定向到 keycloak 登录表单,并且可以使用演示用户的用户凭据登录。

然后我被重定向回

/secure
,网站显示
Access denied
403 forbidden
响应代码。 钥匙斗篷控制台说

16:44:56,691 WARN  [org.keycloak.events] (default task-8) 
type=CODE_TO_TOKEN_ERROR, 
realmId=master, 
clientId=test, 
userId=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, 
ipAddress=127.0.0.1, 
error=invalid_code, 
grant_type=authorization_code, 
code_id=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, 
client_auth_method=client-secret

node.js 控制台显示

Could not obtain grant code: 400:Bad Request

我做错了什么?

node.js express jboss keycloak
3个回答
0
投票

您正在使用名为

/secure
 的领域角色来保护您的资源 
master

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

您需要创建主角色并分配给

demouser
,如下所示


0
投票

如果您正在运行 keycloak 以及 Docker 中的后端,则配置文件中的 keycloak url 将不再是 localhost。您的后端将尝试访问其自己的本地主机,该本地主机在 Docker 下具有不同的 IP 地址。您可以检查 Docker 的网络设置,为您的后端和 keycloak 创建一个公共网络,或者将两者提供给您的主机并更改 auth-server-url,如图所示。

const keycloakConfig = {
  'confidential-port': 0,
  'auth-server-url': 'http://host.docker.internal:8080/auth',
  resource: 'my-client-id',
  'ssl-required': 'external',
  realm: 'my-realm',
  credentials: {
    secret: 'my-secret',
  },
};

-1
投票

此问题是 npm keycloak-connect 软件包的问题,当您使用 npm install 进行安装时,必须收到一条警告,提示运行 npmaudit。

运行 npmaudit --force abd 重新运行应用程序,它将起作用。我被同样的问题困扰了一天,这件事成了我的救星。

在 npm 安装后运行 npmaudit --force。

npm 安装

npm 审计 --force

© www.soinside.com 2019 - 2024. All rights reserved.