我在学习密钥披风- openIdConnect。
上下文
我有三个不同的用户定居在Keycloak。我有用户和管理员的角色。以及用户应用和管理应用领域的角色。
admin
我可以通过以下方式为所有三个用户生成access_token:
http://localhost:8080/realms/<MY_REALM>/protocol/openid-connect/token
我检查了所有用户对授权角色的访问令牌,它们都在那里。
我有一个简单的NodeJS应用程序,在每个路由上都使用带有json消息的快递服务器。并为NodeJS使用密匙斗篷连接保护这些路由,如下所示:
router.get('/anonymous', function(req, res) {
res.status(200).json({
messgae: "[HELLO ###ANONYMOUS###]"
})
})
router.get('/user', keycloak.protect('user'), function(req, res) {
res.status(200).json({
messgae: "[HELLO ###USER###]"
})
})
router.get('/admin', keycloak.protect('admin'), function(req, res) {
res.status(200).json({
messgae: "[HELLO ###ADMIN###]"
})
})
router.get('/all-user', keycloak.protect(['user', 'admin']), function(req, res) {
res.status(200).json({
messgae: "[HELLO ###AALLL USER###]"
})
})
行为
我可以让/user和/all路由提到employee1和employee3 - access_token,他们是用户。
但是,当我获得一个管理访问令牌并请求/admin和/all-user时,邮递员将返回一个HTML来登录领域。
在邮递员控制台,我能够得到一个url,引导我到领域登录页面,我输入用户和密码,但无法登录。
我缺少什么可以使用管理角色访问资源?
发布于 2022-10-28 17:02:33
为了进行JWT验证,您需要设置键斗篷和中间件( Keycloak )之间的公钥。
如果与其不匹配,则keycloak-connect
将产生此错误。
Could not obtain grant code: Error: Grant validation failed. Reason: Misconfigured parameters while validating token. Check your keycloak.json file!
这是我的演示步骤和配置
密钥披风: v18.0.2
王国:我的王国
客户:我的客户
港口: 8080
从我的领域的RS256(RSA)获取公钥,如下所示
它应该与keycloak.json
项目中的keycloak-connect
相匹配。
{
"realm" : "my-realm",
"realm-public-key" : "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmhlpOZBxGjjQD0TTPOzSfmxFBTgpNHWwGOdLn4uK2Y7gLu4Z1BJCISIwfCqfEDmCBQO19X/caNMo0opbZl2qdEnsu7FGN90PWFaBUAS2DASRwhL2UZbuKOVLsUIXpDnDrAGP8ZR5nmQRkWaP7kYT7AErGrcBh4qfzXiw7aIEGI4e24MvK0L1AOVcv2ewPT4I2XAmjPcBsbcrMdrlU5kRYmuPm1Yix2J638VnvPuHRpqSt94e5LiBuo9NnP4pq6G8BZ29D02QKeV8zZcaD4N8clGSI2RMbr3mTp2hAZlNqRtFldpICfapWc5bnmR72UH8ZyV0b/D2LpqUFUirI2KJXQIDAQAB",
"auth-server-url" : "http://localhost:8080/auth",
"ssl-required" : "external",
"resource" : "my-client",
"public-client" : true
}
这是index.js
in keycloak-connect
项目
const Keycloak = require('keycloak-connect')
const express = require('express')
const session = require('express-session')
const router = express()
const server = router.listen(3000, function () {
const host = server.address().address
const port = server.address().port
console.log('Example app listening at http://%s:%s', host, port)
})
function get_user_name(token) {
if (!token) {
return 'Error';
}
const [header, payload, signature] = token.split(".")
if(JSON.parse(Buffer.from(payload, "base64")).preferred_username) {
return JSON.parse(Buffer.from(payload, "base64")).preferred_username;
}
return 'No User Name';
}
const memoryStore = new session.MemoryStore()
router.use(session({
secret: 'mySecret',
resave: false,
saveUninitialized: true,
store: memoryStore
}))
const keycloak = new Keycloak({
store: memoryStore
})
router.use(keycloak.middleware({
logout: '/logout',
admin: '/'
}))
router.get('/login', keycloak.protect(), function (req, res) {
console.log('user login success!');
})
router.get('/user', keycloak.protect('user'), function (req, res) {
console.log('hello user: ' + get_user_name(req.session['keycloak-token']));
})
router.get('/admin', keycloak.protect('admin'), function (req, res) {
console.log('hello admin: ' + get_user_name(req.session['keycloak-token']));
})
router.get('/all-user', keycloak.protect(['user', 'admin']), function (req, res) {
console.log('hello user & admin :' + get_user_name(req.session['keycloak-token']));
})
这是package.json
in keycloak-connect
项目
{
"name": "nodejs-keycloak-example",
"version": "0.1.0",
"main": "index.js",
"scripts": {
"start": "node index.js"
},
"dependencies": {
"express": "*",
"express-session": "*",
"keycloak-connect": "^18.0.2"
}
}
密钥披风装置
添加客户端并分配重定向URL,与在keycloak-connect
项目中相同
http://localhost:3000/*
添加三个用户(所有用户密码设置为1234
)
在my-client
中添加两个角色
正如您所提到的那样,管理员角色分配了两个用户。
指定两个用户(emplyee1和employee3)的用户角色
在运行“npm安装”之后,通过“npm”运行项目
使用Chrome
或Firefox
代替邮递员。邮递员不能按sign in
按钮登录。它只是HTML预览,不支持完整的功能。
我正在使用Chrome
和VS Code
终端进行npm start
使用employee1 localhost:3000/user
登录
使用employee3在localhost:3000/all-user
上登录
使用employee1 localhost:3000/admin
登录它将被拒绝访问
您需要通过localhost:3000/logout
注销下一个用户。
https://stackoverflow.com/questions/74230315
复制相似问题