如何在NestJS中正确使用keycloak

时间:2019-06-27 11:57:46

标签: node.js authentication keycloak nestjs

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

2 个答案:

答案 0 :(得分:2)

我从来没有亲自尝试过,但是我想我会很快的。我会做什么:

  1. 再次检查身份验证技术,尤其是学习如何在嵌套中实施护照的不同策略:https://docs.nestjs.com/techniques/authentication
  2. 看看npm-package及其文档。来自护照的家伙专门为OpenID专门设置了一个部分:http://www.passportjs.org/docs/openid/
  3. 在nestjs中实施OpenID策略-在这里,我将按照文档进行操作,因为它们相当不错

我希望这可以帮助您。最终,您将在KeyCloak中使用护照的OpenID实现,并可以使用防护来保护您的路线/方案。

答案 1 :(得分:2)

这是一个古老的问题,但是由于我刚刚完成了实现,所以我想指向一个很棒的教程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);
    }
}