Nginx静态资源或者路径鉴权方式

 更新时间:2024年06月19日 10:55:06   作者:longxiaobai_WJ  
这篇文章主要介绍了Nginx静态资源或者路径鉴权方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1. http_auth_request_module

# 版本说明 nginx 1.20.2, 默认自带 http_auth_request_module
# 模块查看验证 nginx -V (nginx -V| grep 'http_auth_request_module')

2. 鉴权接口准备

本文后端接口是通过Egg.js来实现的

实现代码取决于项目中使用何种后端语言

'use strict';

const Controller = require('egg').Controller;

class AuthController extends Controller {
  async index() {
    const { ctx } = this;
    ctx.body = 'hi, AuthController';
  }

  async login() {
    const { ctx, service } = this;
    const secrect = Date.now();
    const jwt_token = await service.actionToken.apply(secrect);

    ctx.helper.success();
    // ctx.app.jwt.verify(jwt_token, this.app.config.jwt.secret);

    ctx.body = {
      status: 200,
      secret: jwt_token,
    };
  }

  async authorize() {
    // 获取 POST 传递的参数
    console.log(this.ctx.params);
    // 获取 GET 传递的参数
    console.log(this.ctx.query);
    // 获取通过 cookie 传递的参数
    const isAuthToken = this.ctx.cookies.get('authorize', {
      signed: false,
    });
    console.log('isAuthToken log', isAuthToken);
    // 该代码为兼容 4-2 配置代码
    console.log('x-original-uri', this.ctx.headers['x-original-uri']);

    if (isAuthToken) {
      this.ctx.body = {
        status: 200,
        secret: 'jwt_token',
      };
    } else {
      this.ctx.status = 403;
    }
  }
}

module.exports = AuthController;

3. 修改Nginx配置

server {
    listen 8080;
    server_name localhost;

    #charset koi8-r;

    #access_log  logs/host.access.log  main;
    location = / {
        root index;
        index index.html index.htm;
    }

    location /eggjs {
        if ($http_cookie) {
            set $code_cookie $http_cookie;
        }
        if ($arg_code) {
            set $code_cookie "authorize=$arg_code; Path=/";
        }
        # 指定auth_request
        auth_request /auth;
        proxy_pass http://127.0.0.1:3000/static/index.html;
    }

    # 验证配置
    location /jwt {
        proxy_pass http://localhost:3000/authorize;
    }

    location /scripts {
        proxy_pass http://127.0.0.1:3000/static/scripts/;
    }

    location = /auth {
        internal;
        # $http_cookie
        proxy_set_header Cookie "$code_cookie";

        # 鉴权服务器的地址
        proxy_pass http://localhost:3000/authorize;

        # proxy_pass_request_body off;
        # proxy_set_header Content-Length "";
        # proxy_set_header X-Original-URI $query_string;
        # proxy_set_header X-Original-URI $request_uri;
    }

    #error_page  404              /404.html;

    # redirect server error pages to the static page /50x.html
    #
    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}

4. 配置说明

指定auth_request

auth_request /auth;

传递完整的原始请求URI

  • 由于身份验证子请求将丢弃请求体,可以通过以下配置传递信息(本文未使用该方式,故皆已注释);
# proxy_pass_request_body off;
# proxy_set_header Content-Length "";
# proxy_set_header X-Original-URI $query_string;
# proxy_set_header X-Original-URI $request_uri;

传递校验信息

# URL: http://localhost:8080/eggjs?code=202304
# 设置变量 $code_cookie,以便后续使用,此处配置兼容 cookie 与 query 两种写法
if ($http_cookie) {
    set $code_cookie $http_cookie;
}
if ($arg_code) {
    # $arg_code 与 URL上的参数code相对应
    # 即 secrect=202304 应对应 $arg_secrect
    set $code_cookie "authorize=$arg_code; Path=/";
}

# 在此处使用变量 $code_cookie
proxy_set_header Cookie "$code_cookie";

Extra Config Notes

以下配置,本文尚未验证;

location /eggjs {
    auth_request /auth;
    auth_request_set $auth_status $upstream_status;
    if ($auth_status = "403") {
        return 403;
    }
    proxy_pass http://127.0.0.1:3000/static/index.html;
}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 解决SSE流被Nginx缓存的问题

    解决SSE流被Nginx缓存的问题

    如果你的服务使用了nginx网关,可能会出现nginx缓冲sse流的问题,导致的现象是,客户端调用sse接口时,流数据并不是一条条出现的,而是一口气出现的,本文将给大家介绍如何解决SSE流被Nginx缓存的问题,需要的朋友可以参考下
    2023-10-10
  • Nginx配置如何区分PC或手机访问不同域名

    Nginx配置如何区分PC或手机访问不同域名

    这篇文章主要介绍了Nginx配置如何区分PC或手机访问不同域名,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • nginx支持.htaccess文件实现伪静态的方法分享

    nginx支持.htaccess文件实现伪静态的方法分享

    这篇文章主要介绍了nginx支持.htaccess文件实现伪静态的方法分享,需要的朋友可以参考下
    2015-01-01
  • nginx配置多个前端项目实现步骤

    nginx配置多个前端项目实现步骤

    本文主要介绍了nginx配置多个前端项目实现步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • nginx中的两个模块的proxy_pass的区别解析

    nginx中的两个模块的proxy_pass的区别解析

    在nginx中配置proxy_pass代理转发时,如果在proxy_pass后面的url加/,表示绝对根路径;如果没有/,表示相对路径,把匹配的路径部分也给代理走。本文给大家介绍nginx中的两个模块的proxy_pass的区别,感兴趣的朋友一起看看吧
    2021-11-11
  • nginx配置多个虚拟主机vhost的方法示例

    nginx配置多个虚拟主机vhost的方法示例

    这篇文章主要介绍了nginx配置多个虚拟主机vhost的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • nginx服务器的下载安装与使用详解

    nginx服务器的下载安装与使用详解

    这篇文章主要介绍了nginx服务器的下载安装与使用,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • nginx启动、配置及测试图文详解(全网最全)

    nginx启动、配置及测试图文详解(全网最全)

    nginx是一个轻量级的网页服务器、方向代理服务器和电子邮件代理服务器,具有配置灵活、静态资源高并发、系统资源占用少、拥有缓存服务等优点,这篇文章主要给大家介绍了关于nginx启动、配置及测试的相关资料,需要的朋友可以参考下
    2024-02-02
  • Nginx 代理转发阿里云OSS上传的实现代码

    Nginx 代理转发阿里云OSS上传的实现代码

    这篇文章主要介绍了Nginx 代理转发阿里云OSS上传的实现代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-09-09
  • Nginx服务器中配置非80端口的端口转发方法详解

    Nginx服务器中配置非80端口的端口转发方法详解

    这篇文章主要介绍了Nginx服务器中配置非80端口的端口转发方法详解,文中使用到了Nginx中的proxy_pass配置项,需要的朋友可以参考下
    2016-04-04

最新评论