使用 keycloak 保护节点 js 后端 API

Posted

技术标签:

【中文标题】使用 keycloak 保护节点 js 后端 API【英文标题】:Secured nodejs backend API's using keycloak 【发布时间】:2019-12-25 18:28:29 【问题描述】:

我正在实现一个 Nodejs 后端 API。其中一些需要在访问之前进行身份验证。为此,我选择 keycloak 服务器作为身份服务器。我使用 npm keycloak-connect 库来集成节点服务器和 keycloak 服务器。 现在身份验证工作正常。

问题是当我使用 'http://localhost:8080/auth/realms/test-realm/protocol/openid-connect/logout' 这个 API 从 keycloak 服务器注销时。 keycloak 服务器说令牌不再有效。但是当我使用相同的方式访问节点服务器时,它会将该令牌作为有效令牌。

'use strict';

const Keycloak = require('keycloak-connect');
const express = require('express');
var cors = require('cors')
const app = express();

app.use(cors())


var keycloakConfig =
  "realm": "test-realm",
  "auth-server-url": "http://localhost:8080/auth",
  "ssl-required": "external",
  "resource": "test-dev-api",
  "public-client": true,
  "confidential-port": 0


var keycloak = new Keycloak(,keycloakConfig);

app.use( keycloak.middleware(  logout: '/logout' ));

app.get('/secured-echo', keycloak.protect(), function(req,resp) 
  resp.send("Secured Hello");
);

//unprotected route
app.get('/echo', function(req,resp) 
  console.log(keycloakConfig)
  console.log(keycloak)
  resp.json("say": "hello");
);

app.listen(4000, function () 
  console.log('Listening at port:4000');
);

【问题讨论】:

【参考方案1】:

您的应用程序使用 Express,它维护自己的会话并将其与 Keycloak 令牌同步。所以在 Keycloak 上登出并不会告诉 Express 你已经登出。随后您仍然可以登录到您的应用程序。

在你的代码中你已经指定了这个:

app.use( keycloak.middleware(  logout: '/logout' ));

在您的 Express 应用程序中注销的应用程序的 URL 是什么。使用它而不是直接注销 Keycloak。然后,keycloak 中间件将在 Keycloak 中注销。会是这样的

http://localhost:4000/logout

【讨论】:

【参考方案2】:

我觉得你应该先用app.use( keycloak.middleware( logout: '/logout' ));这个

app.listen(4000, function () 
  console.log('Listening at port:4000');
);

【讨论】:

以上是关于使用 keycloak 保护节点 js 后端 API的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak,如何保护不提供网页的 Spring Boot 后端?

CORS 问题 - 使用 Keycloak 保护 ReactJS 前端和 JAX-RS 后端

通过 REST 与 Keycloak 保护的后端进行后端到后端通信

如何使用 Keycloak 保护 Angular 8 前端和使用网关、eureka 的 Java Spring Cloud 微服务后端

节点 Keycloak 请求即使使用不记名令牌也会返回登录

如何使用 keycloak 保护 angular/spring 应用程序?