如何在 NestJS 中正确使用 keycloak

Yur*_*nko 5 authentication node.js keycloak nestjs

我需要在 NestJS 和 GraphQL (type-graphql) 中使用 keycloak。有一些使用纯 Express 的指南,但我更喜欢使用 NestJS 身份验证模式。有人可以给任何建议吗?

dav*_*ola 7

这是一个老问题,但由于我刚刚实现了它,我想指出一个很棒的教程Protecting your NestJS API with Keycloak。它不使用passport,而只是调用 Keycloak 上的 OpenId Connect UserInfo 端点:https ://openid.net/specs/openid-connect-core-1_0.html#UserInfo 。

我发现添加到应用程序非常容易,非常容易遵循,而且通常非常有用(与我之前使用的未命名的 SaaS 应用程序相比)。

async authenticate(accessToken: string): Promise<User> {
    const url = `${this.baseURL}/realms/${this.realm}/protocol/openid-connect/userinfo`;

    try {
        const response = await this.httpService.get<KeycloakUserInfoResponse>(url, {
            headers: {
                authorization: `Bearer ${accessToken}`,
            },
        }).toPromise();

        return {
            id: response.data.sub,
            username: response.data.preferred_username,
        };
    } catch (e) {
        throw new AuthenticationError(e.message);
    }
}
Run Code Online (Sandbox Code Playgroud)


wal*_*nns 5

我自己从未尝试过,但我想我很快就会尝试。我会怎么做:

  1. 再次查看Authentication Technique,特别是学习如何在nest中实现passport的不同策略:https : //docs.nestjs.com/techniques/authentication
  2. 查看 npm-package 及其文档。护照中的人专门为 OpenID 提供了一个完整的部分:http : //www.passportjs.org/docs/openid/
  3. 在 nestjs 中实现 OpenID-Strategy - 在这里我只会按照文档进行操作,因为它们非常好

我希望这可能会帮助你。在一天结束时,您将使用 KeyCloak 实现 Passport 的 OpenID 实现,并且可以使用警卫来保护您的路线/方案。