对于nodejs +类型记录项目,我有一个带有一些用户的Keycloak领域作为IdP。
我目前有这两次会议,如它所示:

如果我按下“全部注销”,它们就会从这里消失,但它们仍然有效。
示例:
1) I create a new session. I get its JWT token as a response
2) I do a GET req on one of the protected routes with the token attached. It works.
4) I logout all sessions by pressing the button in that photo
5) I do the same GET req on the same protected route. It still works.
I expect it NOT to work, because I previously logged out all sessions.这是我的密钥披风配置
import express, {Application} from 'express';
import { Keycloak as KeycloakType } from "keycloak-connect";
var session = require('express-session');
var Keycloak = require('keycloak-connect');
let _keycloak: KeycloakType;
var memoryStore = new session.MemoryStore();
let kcConfig = {
clientId: 'restapi',
bearerOnly: true,
serverUrl: 'http://localhost:8080/auth',
realm: 'supercatalog',
realmPublicKey: 'deleted'
};
function getKeycloak() {
if (_keycloak) {
return _keycloak;
}
console.log("Initializing Keycloak...");
_keycloak = new Keycloak({ store: memoryStore }, kcConfig);
return _keycloak;
}
export {getKeycloak, memoryStore};我的保护路线
router.get('/', keycloak.protect(), async (req:Request, res:Response):Promise<void> => {
var bearerToken: string = await (await keycloak.getGrant(req, res)).toString() as string;
var decoded: any = jwtDecode(bearerToken);
console.log(decoded.resource_access.restapi.roles);
res.send("hello");
});我是不是误解了象征性的流动?
发布于 2022-02-28 10:11:07
一般来说,会话独立于JWT。JWT的优点(和缺点)是,应用程序只能用公钥加密验证它们,公钥可以是预共享的,也可以是动态查找和缓存的。JWT是自编码存取令牌的一个例子,这意味着您可以在不连续调用中央身份验证/授权服务的情况下验证它。这使得它们非常适合在分布式系统和零信任体系结构中进行身份验证,只要您能够信任颁发者的公钥,您就可以验证和信任一个提交的JWT。
,但带来了不利的一面。JWT包含一个到期时间,在此之前,应用程序将认为它是有效的。正如前面已经提到的,JWT的使用者,就像REST一样,不需要与发布服务交谈来验证它。
因此,在您的特定情况下,您的应用程序会看到一个JWT,加密地验证它并验证它是否已经过期,并因此接受它。
使用JWT的系统的分散性意味着撤销JWT本身通常没有完成。这是因为它需要维护一个撤销列表,并且您必须拥有一个中央服务才能做到这一点。这并不是说它在技术上是不可能的,但这样做首先就失去了使用JWT的许多好处。
由于会话是独立于JWT管理的,因此可以使会话无效,而为会话发出的JWT仍然有效。如果您需要一个有效的会话,那么您必须独立于基于JWT的身份验证来执行。
发布于 2022-02-28 14:18:53
您所缺少的称为象征性内省 of OAuth 2.0。正如RobV所提到的,JWT可以用于在没有访问令牌的情况下验证访问令牌,但另一方面,可以对服务器进行网络调用来验证它。
当使用keycloak-connect时,这是在授予管理器的函数validateAccessToken中实现的.另一方面,keycloak.protect()请求-处理程序是以这样的方式构建的,如果访问令牌无效,它将使用刷新-令牌发出一个新的令牌(比较代码)。因此,尽管您被按下注销,它会自动再次登录。
您可以使用另一个自定义处理程序来自省令牌(也讨论了这里):
const introspection = async function (req: any, res: any, next: any) {
try {
let grant = await keycloak.getGrant(req, res);
let isValid = await keycloak.grantManager.validateAccessToken(grant.access_token!!);
if (!isValid) {
return keycloak.accessDenied(req, res);
} else {
return next();
}
} catch (e) {
console.log(e);
return keycloak.accessDenied(req, res);
}
}
app.get('/protected/resource', keycloak.checkSso(), introspection, function (req, res, next) {
console.log('I am in');
}不过,Keycloak只允许在客户端保密时调用内省端点。
https://stackoverflow.com/questions/71293140
复制相似问题