Nginx微服务认证

时间:2018-07-26 19:07:46

标签: nginx microservices

在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;
    }
}

例如,我要创建“ user-serivce”,它将提供有关用户的信息。我希望它为普通用户提供有关当前用户的信息,为管理员提供有关所有用户的信息。

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

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

1 个答案:

答案 0 :(得分:0)

使用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;
}

现在,每当客户端请求url以/ service / users开头时,Nginx都会向/ auth发出内部子请求,在此示例中,在标题中传递客户端IP和授权令牌,但是您可以根据自己的需要进行配置

您的身份验证服务器脚本会收到该子请求,执行您需要执行的所有身份验证,如果要允许访问,则对它进行编码以返回200的HTTP响应代码,否则请返回401。

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