当前位置: 首页 > 知识库问答 >
问题:

调用rest api时,keycloak注销不会使令牌无效

傅元章
2023-03-14

我有一个React应用程序,它使用Keycloak作为身份验证服务。另外,我有一个Nodejs rest api,endpoint由keycloak保护,所以React应用程序在需要调用api时发送JWT。在Keycloak管理控制台中,我创建了一个带有用户和角色的公共客户端。

所有工作都很好,但唯一的问题是,当我通过管理控制台注销时,或者在过期之前从我的React应用程序注销时,我仍然可以用这些令牌调用我的应用程序。

我的节点应用程序使用keycloak-node-connect适配器,我的keycloak.json是:

{
    "client-id": "my-public-client",
    "bearer-only": true,
    "auth-server-url": "http://localhost:8180/auth",
    "realm": "my-realm"    
}

共有1个答案

慕容宏毅
2023-03-14

keycloak.config.js

var session = require('express-session');
var Keycloak = require('keycloak-connect');
var request = require('request');
const createError = require('http-errors');

let _keycloak;

var memoryStore = new session.MemoryStore();

function initKeycloak() {
    if (_keycloak) {
        console.log("Trying to init Keycloak again!");
        return _keycloak;
    }
    else {
        console.log("Initializing Keycloak...");
        _keycloak = new Keycloak({ store: memoryStore });
        return _keycloak;
    }
}

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

async function validateTokenKeycloak(req, res, next) {
    if (req.kauth && req.kauth.grant) {        
        console.log('--- Verify token ---');
        try {
            var result = await _keycloak.grantManager.userInfo(req.kauth.grant.access_token);
            //var result = await _keycloak.grantManager.validateAccessToken(req.kauth.grant.access_token);
            if(!result) {
                console.log(`result:`,  result); 
                throw Error('Invalid Token');
            }                        
        } catch (error) {
            console.log(`Error: ${error.message}`);
            return next(createError.Unauthorized());
        }
    }
    next();  
}

module.exports = {
    memoryStore,
    initKeycloak,
    getKeycloak,
    validateTokenKeycloak
};
 类似资料:
  • null null 问题-需要输入如何使此令牌无效或过期?或者有没有其他方法可以解决这个问题呢?

  • 我使用Keycloak来保护我的react前端和Node.js后端。这些客户端使用基于角色的授权进行保护。 我尝试这个endpoint来撤消用户访问令牌。但不起作用/auth/admin/realms//users/ 是否有方法在Keycloak中撤销特定用户的访问令牌?

  • 问题内容: 我在hapijs中使用jwt插件和策略。 我可以在登录用户时创建jwt令牌,并通过’jwt’策略使用同一令牌对其他API进行身份验证。 我将令牌设置为cookie,其中是令牌名称。另外,我没有将这些令牌保存在数据库中。 但是,注销时如何销毁jwt令牌? 请提出一种方法。 问题答案: JWT存储在浏览器中,因此删除令牌以删除客户端的cookie 如果您还需要在令牌到期之前从服务器端使令牌

  • 我在从(移动)应用程序调用KeyCloak注销endpoint时遇到问题。 支持此方案,如其文档中所述: /realms/{realm-name}/protocol/openid-connect/logout 注销endpoint注销经过身份验证的用户。 可以将用户代理重定向到endpoint,在这种情况下,活动用户会话将注销。然后,用户代理被重定向回应用程序。 endpoint也可以由应用程序直

  • 我第一次获取FCM并将其保存到我的用户默认值。现在当用户注销时,我如何再次刷新FCM令牌?我搜索了文档和许多其他问题,但没有找到更好的解决方案。 提前谢谢。

  • 嗨,我正在创建使用 REST API endpoint与服务器端通信的移动本机应用程序。 我以前有开发本机客户端的经验,但我将简单的令牌(随机生成的字符串)存储在存储用户信息的同一表中的数据库中。所以它就像浏览器中使用的会话,但每个请求的标头中都有令牌,而不是 cookie。 最近我发现了JWT令牌。这似乎是保护私有endpoint的好方法。您可以从移动客户端请求令牌,前提是您通过登录并获得生成的