资讯专栏INFORMATION COLUMN

通过Nginx的auth_request以及ExpressJS构建权限验证系统

zhaofeihao / 1309人阅读

摘要:用户通过此即可获得服务器的认可授权。同时,此方案可以对同一域名下的不同子域名中的内容进行访问限制。注意事项设置的时,由于本案例中使用了不同的子域名及,需要特别设置的项,如下所示其中的格式为。

本文的内容是我的开源代码(https://github.com/e10101/AdminLogin)的中文说明。
项目主要是实现了通过合理配置Nginxauth_request模块来实现对敏感路径下的内容进行访问限制。

代码

可通过Github访问:https://github.com/e10101/AdminLogin,来获取代码。如果可以的话,可以Star一下。

开发初衷

这个项目是为了解决网站中部分管理资源(路径)需要进行权限限制,但又不想通过复杂系统去实现而进行编写的项目.

同时这个项目也没有采用Nginxauth_basic模块来实现权限限制.二是通过auth_request来进行的权限限制.

结构框架

本项目是基于NodeJS/ExpressJS/PassportJS以及Github的。

为讲解方便,假设存在:
服务器A(server1.example.com),其路径/installs上存有敏感信息,其他路径可公开访问,端口3003。
服务器B(login.example.com),为认证服务器,其上部署了本项目代码,端口4001。

系统以CentOS7.2为例,认证使用的Github用户认证。

示意配置

服务器A(server1)的Nginx配置文件

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

    server_name  server1.example.com;

    location = /auth {
        internal;
        proxy_pass http://login.example.com;

        proxy_pass_request_body     off;

        proxy_set_header X-Original-URI $request_uri;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }

    error_page 401 = @error401;
    location @error401 {
        return 302 http://login.example.com;
    }
    location / {
        try_files $uri $uri/ @proxy;
    }

    # The path has secret content
    location /installs {
        auth_request /auth;
        try_files $uri $uri/ @proxy;
    }

    location @proxy {
        proxy_set_header  Host $host;
        proxy_set_header  X-Real-IP $remote_addr;
        proxy_set_header  X-Forwarded-Proto https;
        proxy_set_header  X-Forwarded-For $remote_addr;
        proxy_set_header  X-Forwarded-Host $remote_addr;
        proxy_pass    http://127.0.0.1:3003;
    }
}

服务器B(login)的Nginx配置

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

    server_name  login.example.com;

    location / {
    proxy_set_header  Host $host;
    proxy_set_header  X-Real-IP $remote_addr;
    proxy_set_header  X-Forwarded-Proto https;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  X-Forwarded-Host $remote_addr;
    proxy_pass    http://127.0.0.1:4001/;

    }
}
基本流程

用户访问服务器A的敏感资源(即路径/installs中的内容),Nginx通过配置文件中的auth_request字段去请求http://login.example.com/auth,由于用户并未在服务器B进行登录,因此服务器B返回了401无权限的错误。

根据服务器A的配置,发现401错误后,会向用户返回302状态指向为服务器B的主机地址(login.example.com)。

用户浏览器跳转到服务器B,并选择第三方的用户认证进行授权(此处以Github为例),当用户通过Github进行授权后,回向服务器B返回用户的个人信息。

服务器B从第三方反馈回的信息中,检索出用户的用户名(username),然后服务器B会将此用户名与已有的管理员信息进行对比(此处通过配置文件实现),如果登录用户为合法的管理员账号,则服务器B授权其登录进入。如果为非法用户,则不对其授权,因此非法用户无法获得有效登录凭证。

如果用户为合法用户:
那么服务器B将会生成session,并通过Set-cookie命令告知用户浏览器。用户通过此Cookie即可获得服务器B的认可授权。当用户通过此Cookie访问服务器B中的/auth目录时,会返回200的状态码。

如果用户为非法用户:
那么服务器B将不会session,由于用户无法获得认可的Cookie,那么当用户再次访问/auth的路径时,服务器会返回401错误。

假设用户已经授权成功,那么当用户访问服务器A中的敏感内容/installs时,服务器A访问服务器B的/auth路径,此时返回200状态码,服务器A则允许用户进行访问。

以上,通过auth_request模块以及相关配置就实现了对敏感内容的访问限制。而且通过第三方的机制,也无需自己手工实现登录功能。同时,此方案可以对同一域名下的不同子域名中的内容进行访问限制。可以重复利用一个登录系统,服务于多个其他系统。

注意事项

设置Express的session时,由于本案例中使用了不同的子域名(server1.example.com及login.example.com),需要特别设置cookiedomain项,如下所示:

app.use(session({ 
 secret: config.session.secret,
 cookie: {
   path: config.cookie.path,
   domain: config.cookie.domain,
   maxAge: config.cookie.maxAge
 }
}));

其中的domain格式为:.example.com

关于为何使用Github的问题。

国内可以访问(此项排除了Facebook,Google,Twitter等);

创建应用简单无需审核(此项排除了微信,微博等)。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/39310.html

相关文章

  • 通过Nginxauth_request以及ExpressJS构建权限验证系统

    摘要:用户通过此即可获得服务器的认可授权。同时,此方案可以对同一域名下的不同子域名中的内容进行访问限制。注意事项设置的时,由于本案例中使用了不同的子域名及,需要特别设置的项,如下所示其中的格式为。 本文的内容是我的开源代码(https://github.com/e10101/AdminLogin)的中文说明。项目主要是实现了通过合理配置Nginx的auth_request模块来实现对敏感路径...

    nidaye 评论0 收藏0
  • Docker 私有注册中心身份认证

    摘要:考虑到这一点,我们花费了一些时间审查了我们维护的多种系统,并在这星期,我给我们的私人注册中心设置了添加身份认证的目标。你也许知道,注册没有提供身份认证的方法。授权响应触发客户端回应一组使用基本身份验证的凭据。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已经融入了我们的生活。我们锁门...

    klinson 评论0 收藏0
  • Docker 私有注册中心身份认证

    摘要:考虑到这一点,我们花费了一些时间审查了我们维护的多种系统,并在这星期,我给我们的私人注册中心设置了添加身份认证的目标。你也许知道,注册没有提供身份认证的方法。授权响应触发客户端回应一组使用基本身份验证的凭据。 注:原文作者是 Alex Ianchici,原文地址是 Docker private registry authentication 安全已经融入了我们的生活。我们锁门...

    Cc_2011 评论0 收藏0
  • 单点登录nginx代理及开发环境调试配置

    摘要:最近做项目,遇到单点登录,方法是在前端做代理。调通之后开始思考如何在本地开发环境调试单点登录这一功能。 最近做项目,遇到单点登录,方法是在前端做nginx代理。应用系统需要配合做如下调整:1、使用*.顶级域名访问,确保可以和KAM共享cookie2、对来自Nginx代理的访问放开登录认证(安全起见,对来自其他IP的访问应该禁止)3、应用系统从请求头kam_remote_user中读取登...

    go4it 评论0 收藏0
  • NginxExpressJS转发真实IP地址

    摘要:由于服务器配置了的反向代理,在中无法获取到真实的地址。本文就介绍了如何配置以及使其可以显示用户的真实地址。中的设置在中的靠前位置,添加搞定通过上述的设置,现在你使用或就可以获取到用户真实的地址了。资料官网关于的文档介绍中设置的文章 由于服务器配置了Nginx的反向代理,在ExpressJS中无法获取到真实的IP地址。本文就介绍了如何配置Nginx以及ExpressJS使其可以显示用户的...

    leap_frog 评论0 收藏0

发表评论

0条评论

zhaofeihao

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<