续集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 } = appconst 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


















