Nginx开源版本支持OpenID和JWT吗?

14

我有一个基本的Nginx Docker镜像,作为反向代理,目前在我的应用服务器前使用基本身份验证。我正在寻找一种将其与我们在开发中使用JWT的SSO解决方案集成的方法,但所有文档都说它需要Nginx+。那么,在开源Nginx内部执行JWT验证是否可能,还是我需要付费版本?


你能确定这是否适用于NGINX开源版吗?我看到了关于NGINX+的帮助文章:https://docs.nginx.com/nginx/deployment-guides/single-sign-on/okta/#okta-assign-applications,但不知道是否值得尝试。 - Rebecca Sich
4个回答

12

当然,有一些开源代码可以供您使用并针对您的情况进行自定义(例如)。

依我看,有更好的实现方式,您可以在应用程序前面使用“授权代理”。我最喜爱的是keycloak-gatekeeper(您可以与任何OpenID IdP一起使用,不仅适用于Keycloak),可以提供身份验证、授权、令牌加密、刷新令牌实现、小型占用空间等功能...


为了提供信息,keycloak-gatekeeper现在是Louketo Proxy:https://github.com/louketo/louketo-proxy 不确定它是否能够处理Azure AD,但我即将尝试。 - Thales Valias
louketo代理已经到了生命周期结束(EOL)的阶段,他们推荐使用https://github.com/oauth2-proxy/oauth2-proxy。 - joergwork
@joergwork 但这并不是一个即插即用的替代品。我最喜欢的仍然是Gatekeeper,但现在是fork https://github.com/gogatekeeper/gatekeeper - Jan Garaj
@JanGaraj 谢谢,我没明白。Gatekeeper 看起来比 oauth2-proxy 更符合我的要求。 - joergwork

3

还有一个叫做lua-resty-openidc的库:https://github.com/zmartzone/lua-resty-openidc

lua-resty-openidc是适用于NGINX的库,实现了OpenID Connect Relying Party(RP)和/或OAuth 2.0 Resource Server(RS)功能。

作为OpenID Connect Relying Party使用时,它使用OpenID Connect Discovery和基本客户端配置文件(即授权码流)对用户进行身份验证。作为OAuth 2.0 Resource Server使用时,它可以验证OAuth 2.0 Bearer Access Token是否有效,并根据预配置的密钥验证JSON Web Token的访问令牌。


0
基于此Gist https://gist.github.com/abbaspour/af8dff3b297b0fcc6ba7c625c2d7c0a3,以下是我在dockerfile中的操作(基于buster-slim)。
FROM python:3.9-slim as base

FROM base as builder

ENV LANG en_GB.UTF-8 \
    LANGUAGE en_GB.UTF-8 \
    PYTHONUNBUFFERED=True \
    PYTHONIOENCODING=UTF-8

RUN apt-get update \
    && apt-get install --no-install-recommends --no-install-suggests -y \
    build-essential  \
    patch \
    git \
    wget \
    libssl-dev \
    libjwt-dev \
    libjansson-dev \
    libpcre3-dev \
    zlib1g-dev \
    && wget https://nginx.org/download/nginx-1.18.0.tar.gz \
    && tar -zxvf nginx-1.18.0.tar.gz \
    && git clone https://github.com/TeslaGov/ngx-http-auth-jwt-module \
    && cd nginx-1.18.0  \
    && ./configure --add-module=../ngx-http-auth-jwt-module \
    --with-http_ssl_module \
    --with-http_v2_module \
    --with-ld-opt="-L/usr/local/opt/openssl/lib" \
    --with-cc-opt="-I/usr/local/opt/openssl/include" \
    && make


FROM base

COPY --from=builder /nginx-1.18.0/objs/nginx /usr/sbin/nginx
COPY --from=builder /nginx-1.18.0/conf /usr/local/nginx/conf

ENV LANG en_GB.UTF-8 \
    LANGUAGE en_GB.UTF-8 \
    PYTHONUNBUFFERED=True \
    PYTHONIOENCODING=UTF-8

RUN apt-get update && \
    apt-get install --no-install-recommends --no-install-suggests -y \
    libssl-dev \
    libjwt-dev \
    libjansson-dev \
    libpcre3-dev \
    zlib1g-dev


0

假设您已经设置了没有身份验证的配置,我找到了这个并让它工作:https://hub.docker.com/r/tomsmithokta/nginx-oss-okta 它完全基于上面提到的lua-resty-openidc。事实上,它已经构建好了,这对我很有帮助。

首先在Okta Web GUI中配置您的Okta应用程序,然后填写NGINX示例conf中未被注释的正确字段。唯一的注意事项是取消注释redirect_uri并填写它,但注释或删除已弃用的redirect_uri_path。配置中的所有其他内容都是您可以玩耍或接受的参数。

默认情况下,它会将您传递到标题页面,但如果您调整proxy_pass字段,应该能够将其传递给您的应用程序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接