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

Posted

技术标签:

【中文标题】节点 Keycloak 请求即使使用不记名令牌也会返回登录【英文标题】:Node Keycloak requests returns Login even with bearer token 【发布时间】:2020-12-11 06:56:19 【问题描述】:

我一直在尝试将 Keycloak 集成到一个简单的节点/快递服务器中,以便我可以使用标头中的不记名令牌进行身份验证,但我发出的每个受保护请求都返回 html(登录页面)。

我的简单 index.js 文件:

const express = require('express');
const app = express();
const keycloak = require('./kc-config.js').initKeycloak();

app.use(keycloak.middleware());

app.get('/', (req, res) => 
  res.send("Server is up!");
);

app.get('/kc-test', keycloak.protect(), (req, res) => 
  res.send('success');
 )

app.listen(3000);

我的简单 kc-config.js 文件

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

let _keycloak;
var keycloakConfig = 
  clientId: 'myclient',
  bearerOnly: false,
  serverUrl: 'http://my.client.com:4008/auth',
  realm: 'master',
  credentials: 
    "secret": "my-secret"
  
;

function initKeycloak() 
  if (_keycloak) 
    console.warn("Trying to init Keycloak again!");
    return _keycloak;
  
  else 
    console.log("Initializing Keycloak...");
    memoryStore = new session.MemoryStore();
    _keycloak = new Keycloak( store: memoryStore , keycloakConfig);
    return _keycloak;
  


function getKeycloak() 
  if (!_keycloak)
    console.error('Keycloak has not been initialized. Please called init first.');
  
  return _keycloak;


module.exports = 
  initKeycloak,
;

我正在使用从这个 curl 请求返回的令牌:

curl -X POST 'http://my.client.com:4008/auth/realms/master/protocol/openid-connect/token'
--header 'Content-Type: application/x-www-form-urlencoded'
--data-urlencode 'grant_type=password'
--data-urlencode 'client_id=myclient'
--data-urlencode 'client_secret=mysecretkey'
--data-urlencode 'username=myusername'
--data-urlencode 'password=mypassword'

我不应该被授权吗?为什么即使我的令牌有效,它也会要求我再次登录?

有关更多信息,这是我在 keycloak 管理控制台上为我的客户端设置的屏幕截图。

我很困惑。我使用它完全错误吗?我的想法是,我可以简单地将 curl 请求中的令牌放入受保护 /kc-test 路由的请求的标头中。

【问题讨论】:

您的客户端的“访问类型”设置为“公开”,但您使用的是客户端密码?公共客户端没有客户端密码。 如果我将其更改为“机密”,也会出现同样的结果。 【参考方案1】:

客户端的访问类型只需为承载。


  "realm": "camunda",
  "auth-server-url": "https://localhost:9000/auth/",
  "ssl-required": "external",
  "resource": "user-management",
  "bearer_only":true,
  "credentials": 
    "secret": "45078604-3c4a-44a6-8a0f-ab094f050211"
  ,
  "confidential-port": 0,
  "policy-enforcer": 

或者您可以在 keycloak.json 文件中将 bearer_only 设置为 true

【讨论】:

以上是关于节点 Keycloak 请求即使使用不记名令牌也会返回登录的主要内容,如果未能解决你的问题,请参考以下文章

将 Keycloak 不记名令牌传递给表达后端?

如何使用节点请求发送不记名令牌和 x-www-form-urlencoded 数据

使用接收到的访问令牌检索 Keycloak 用户数据

使用spring boot(安全)和keycloak启用角色身份验证?

撤销 Keycloak 访问令牌

代表客户端验证密钥斗篷不记名令牌