首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于重定向的身份验证流通过应用网关后的keycloak node.js应用程序进行保护

基于重定向的身份验证流通过应用网关后的keycloak node.js应用程序进行保护
EN

Stack Overflow用户
提问于 2018-10-09 10:30:46
回答 1查看 2.3K关注 0票数 0

我在安全的node.js应用程序中被拒绝访问错误,这是一个官方键盘斗篷示例应用程序

安全的应用程序被篡改,并放在应用程序网关后面,而这个网关本身就是坞化的。

应用程序网关是node.js快速应用程序,它使用http/https包并将传入流量路由到node.js安全应用程序。

因此,为了访问应用程序url映射的url,将添加到网关:

代码语言:javascript
复制
 mappings:
    - /:/
    - /login:/login        
    - /logout:/logout
    - /protected/resource:/protected/resource  

网关进行ssl卸载。Keycloak也进行了对接,它的/auth端点被映射到网关中。

应用程序代码如下:

代码语言:javascript
复制
var Keycloak = require('keycloak-nodejs-connect');
var hogan = require('hogan-express');
var express = require('express');
var session = require('express-session');

var app = express();

var server = app.listen(3005, function () {
  var host = server.address().address;
  var port = server.address().port;
  console.log('Example app listening at http://%s:%s', host, port);
});

app.set('view engine', 'html');
app.set('views', require('path').join(__dirname, '/view'));
app.engine('html', hogan);

app.enable('trust proxy')
var memoryStore = new session.MemoryStore();
app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

app.get('/', function (req, res) {
  res.render('index');
});

var memoryStore = new session.MemoryStore();

app.use(session({
  secret: 'mySecret',
  resave: false,
  saveUninitialized: true,
  store: memoryStore
}));

// Additional configuration is read from keycloak.json file
// installed from the Keycloak web console.

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

app.use(keycloak.middleware({
  logout: '/logout',
  admin: '/',
  protected: '/protected/resource'
}));

app.get('/login', keycloak.protect(), function (req, res) {
  res.render('index', {
    result: JSON.stringify(JSON.parse(req.session['keycloak-token']), null, 4),
    event: '1. Authentication\n2. Login'
  });
});

app.get('/protected/resource', keycloak.enforcer(['resource:view', 'resource:write'], {
  resource_server_id: 'nodejs-apiserver'
}), function (req, res) {
  res.render('index', {
    result: JSON.stringify(JSON.parse(req.session['keycloak-token']), null, 4),
    event: '1. Access granted to Default Resource\n'
  });
});

keycloak.json是:

代码语言:javascript
复制
{
  "realm" : "nodejs-example",
  "realm-public-key" : "[public_key]",
  "auth-server-url" : "https://[https://[gateway_url]]/auth",
  "ssl-required" : "none",
  "resource" : "nodejs-connect",
  "public-client" : true
}

当在浏览器中访问https://[gateway_url]/时,KeyCloak重定向到登录ui,然后在登录ui中输入用户/密码,然后在浏览器中看到拒绝访问的错误。

下面的错误出现在应用程序日志中:

无法获得授予代码错误:{错误:证书链中的自签名证书

因此,基本上,应用程序无法将授权代码交换为访问令牌。

我尝试了什么:

1)使用curl访问Keycloak令牌端点,如下所示(返回Access/Refresh令牌):

代码语言:javascript
复制
 curl -k --key [keypath] --cert [certpath:passphrase] -d "grant_type=authorization_code&client_id=nodejs-connect&redirect_uri=https://[gw_url]/login?auth_callback=1&client_session_state=[client_state]&code=[authz_code]
     -X POST 'https://[gw_url]/auth/realms/nodejs-example/protocol/openid-connect/token'

2)将“auth”改为"https://gateway_url8080__/auth“in keycloak.json也有帮助。返回访问令牌。8080是发表港的Keycloak码头集装箱。

因此,我想问题是,当应用程序中的node.js适配器想要用访问令牌替换authz代码时,它不会向网关提供ssl证书。因此,我尝试将auth-server-url更改为相对的/auth。然而,

无法获得授予代码错误:{ error: ECONNREFUSED 127.0.0.1:80

在应用程序的日志中弹出。

如何正确配置keycloak node.js适配器以保护应用程序网关后面的服务?

EN

回答 1

Stack Overflow用户

发布于 2019-01-13 01:06:52

嘿,我只是犯了同样的错误,通过在keycloak.json中而不是主机名中输入LAN地址来修正。

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

https://stackoverflow.com/questions/52718864

复制
相关文章

相似问题

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