首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在请求资源时用OpenIdConnect重定向到登录页面

在请求资源时用OpenIdConnect重定向到登录页面
EN

Stack Overflow用户
提问于 2022-10-28 03:25:58
回答 1查看 46关注 0票数 0

我在学习密钥披风- openIdConnect。

上下文

我有三个不同的用户定居在Keycloak。我有用户和管理员的角色。以及用户应用和管理应用领域的角色。

admin

  • employee3 -
  • employee1 -
  • employee2-
  • employee2-管理和用户

我可以通过以下方式为所有三个用户生成access_token:

代码语言:javascript
运行
复制
http://localhost:8080/realms/<MY_REALM>/protocol/openid-connect/token

我检查了所有用户对授权角色的访问令牌,它们都在那里。

我有一个简单的NodeJS应用程序,在每个路由上都使用带有json消息的快递服务器。并为NodeJS使用密匙斗篷连接保护这些路由,如下所示:

代码语言:javascript
运行
复制
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,引导我到领域登录页面,我输入用户和密码,但无法登录。

我缺少什么可以使用管理角色访问资源?

EN

回答 1

Stack Overflow用户

发布于 2022-10-28 17:02:33

为了进行JWT验证,您需要设置键斗篷和中间件( Keycloak )之间的公钥。

如果与其不匹配,则keycloak-connect将产生此错误。

代码语言:javascript
运行
复制
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相匹配。

代码语言:javascript
运行
复制
{
    "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项目

代码语言:javascript
运行
复制
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项目

代码语言:javascript
运行
复制
{
    "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项目中相同

代码语言:javascript
运行
复制
http://localhost:3000/*

添加三个用户(所有用户密码设置为1234)

my-client中添加两个角色

正如您所提到的那样,管理员角色分配了两个用户。

指定两个用户(emplyee1和employee3)的用户角色

在运行“npm安装”之后,通过“npm”运行项目

使用ChromeFirefox代替邮递员。邮递员不能按sign in按钮登录。它只是HTML预览,不支持完整的功能。

我正在使用ChromeVS Code终端进行npm start

使用employee1 localhost:3000/user登录

使用employee3在localhost:3000/all-user上登录

使用employee1 localhost:3000/admin登录它将被拒绝访问

您需要通过localhost:3000/logout注销下一个用户。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74230315

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档