风流的沙滩裤 · 2020年度虞城县教育体育局部门预算公开资料 ...· 5 月前 · |
眼睛小的啄木鸟 · 学军紫金港高考成绩 - 抖音· 1 年前 · |
健壮的皮带 · 哥布林的洞�%A - 搜狗图片搜索· 1 年前 · |
豪情万千的芒果 · 斗罗大陆大结局彩蛋公布,唐三小舞举办婚礼,白 ...· 1 年前 · |
闯红灯的冰棍 · 大卫-卡拉丁死时赤身裸体疑似自慰窒息(图)- ...· 1 年前 · |
我在学习密钥披风- 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"
眼睛小的啄木鸟 · 学军紫金港高考成绩 - 抖音 1 年前 |
健壮的皮带 · 哥布林的洞�%A - 搜狗图片搜索 1 年前 |
闯红灯的冰棍 · 大卫-卡拉丁死时赤身裸体疑似自慰窒息(图)-搜狐娱乐 1 年前 |