在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}” )
答案 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
指令来构建更全面的解决方案,以将客户端重定向到登录页面,自定义错误页面,非管理页面,等等。