【问题标题】:Nginx Microservices AuthenticationNginx 微服务认证
【发布时间】:2019-01-03 20:54:20
【问题描述】:

在 Nginx 上构建微服务身份验证的最佳实践是什么?

目前我有下一个反向代理服务

server {
    listen 80;
    listen [::]:80;

    server_name sspay.local;

    location /service/passport/ {
        proxy_pass http://passport-service:3000/;
        proxy_redirect off;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Host $server_name;
    }
}

例如,我想创建“用户服务”,它将提供有关用户的信息。我希望它为普通用户提供有关当前用户的信息,并为管理员提供有关所有用户的信息。

为此,护照服务会提供包含用户权限信息的 JWT 令牌。

那么我如何在 nginx 中创建“中间件”,它将向“passport-service”发出请求,以检查当前 JWT 令牌是否有权访问指定的路由(例如,“/service/users/{id}” )

【问题讨论】:

    标签: nginx microservices


    【解决方案1】:

    使用 Nginx auth request module

    然后在 Nginx 中设置你的指令,如下所示:

    location /service/users/ {
        auth_request /auth;
        ...
    }
    
    location = /auth {
        internal;
        proxy_pass http://passport-service:3000/;
        proxy_pass_request_body off;
        proxy_set_header Content-Length "";
        proxy_set_header X-Real-Ip $remote_addr;
        proxy_set_header Authorization $http_authorization;
    }
    

    现在 Nginx 将在客户端请求 url 以 /service/users 开头时向 /auth 发出内部子请求,在此示例中,在标头中传递客户端 IP 和授权令牌,但您可以对其进行配置以满足您的需要.

    您的身份验证服务器脚本接收子请求,执行您需要执行的任何身份验证,如果您想允许访问,则将其编码为返回 HTTP 响应代码 200,如果您不允许访问,则返回 401。

    这只是一个允许或拒绝访问的基本示例,您可以合并 error_page 和/或 auth_request_set 指令来构建更全面的解决方案,将客户端重定向到登录页面、自定义错误页面、非管理员页面,随便。

    【讨论】:

      猜你喜欢
      • 2015-09-11
      • 2020-12-14
      • 2019-05-27
      • 2019-01-07
      • 2015-06-21
      • 2019-07-29
      • 2016-07-17
      • 2015-07-24
      • 2018-01-06
      相关资源
      最近更新 更多