续集2
前篇文章在前面发布,同学们可以自行找一下。
本篇文章将继续通过实例来详细讲解如何将前端代理服务器(BFF)接入身份认证。我们将使用一个示例应用来演示 BFF 与身份认证的集成过程。
1)在 Keycloak 中新建一个安全领域
在 Keycloak 中新建一个安全领域(Realm),只需要取一个名字就好,如图所示。
代码片段:可切换语言,无法单独设置文字格式
2)在安全领域中新建一个客户端配置
你的 egg.js 服 务 所 公 开 的 终 端 节 点 ( 域 名 + 路径),可以使用通配符,比如https://uniheart.pa-ca.me/*,如图所示。
3)创建 keycloak.json 文件
在 egg.js 项目根目录下添加一个 keycloak.json 文件,内容如下,注意相关字段要和 Keycloak 对应。realm 对应刚刚创建的 Realm,resource 对应刚刚创建的客户端名称。
{
"realm": "UniHeart",
"auth-server-url": "https://keycloak.jiwai.win/auth",
"ssl-required": "external",
"resource": "UniHeart-Client"
}
4)引入 egg-keycloak 插件
随后,添加@jeff-tian/egg-keycloak 插件:
npm install --save @jeff-tian/egg-keycloak
并且在 config/plugin.ts 文件中增加如下配置:
{
//...
keycloak: {
enable: true,
package: '@jeff-tian/egg-keycloak',
},
// ...
}
5)在路由中使用 Keycloak
可在想要保护的路由前,增加 Keycloak 中间件。比如,在/app/router/keycloak/index.ts 文件中,可以使用这样的代码来保护/keycloak/login 路由:
import { Application } from 'egg'
export default (app: Application) => {
const { router } = app
const subRouter = router.namespace('/keycloak')
subRouter.get(
'keycloak.login',
'/login',
app.keycloak.protect(),
async ctx => {
ctx.body = ctx.session['keycloak-token']
},
)
}
以上代码的最终效果和前面所说的示例相同,其关键在于添加 keycloak.protect()中间件。
这样,就完成了基于 egg.js 的 BFF 与 Keycloak 的集成。在这个过程中,我们只需要配置好keycloak.json 文件,然后在路由中使用 keycloak.protect()中间件,就可以实现身份认证和授权的功能。
在这个过程中,egg.js 会自动处理和 Keycloak 的交互,包括获取授权码、使用授权码换取令牌、使用令牌获取用户信息等步骤。这样,我们就可以在 BFF 中使用 Keycloak 来实现身份认证和授权的功能。
如果前端使用了该 egg.js BFF,那么它不需要关心身份认证和授权的细节,只需要调用/keycloak/login接口,就可以获取令牌响应。授权码许可模式中的多个来回请求都由 egg.js BFF 代劳,前端团队也不需要了解 Keycloak 中配置的客户端密码等信息了。
文章未完待续,小伙伴们请等待一下哦!
本文摘自《数字身份认证技术与实践》,获出版社和作者授权发布。
数字身份认证技术与实践——jd