lua-nginx-guard-jwt

验证 JWT 令牌并将其声明值映射到 HTTP 头部或查询参数。

$ opm get dailymotion/lua-nginx-guard-jwt

Nginx Guard - 验证 JWT 令牌并将其声明值映射到 HTTP 头部

此库正在开发中,尚未准备好投入生产使用。

将 JWT 令牌中的声明值映射到 HTTP 头部请求,并允许指定自定义映射。

安装

  • 通过 opm:opm get dailymotion/lua-nginx-guard-jwt

概述

    # nginx.conf
    
    http {
      server {
        listen 80;
        server_name localhost;
    
        location = / {
          access_by_lua '
            local j = require "guardjwt"
            local validators = require "resty.jwt-validators"
    
            j.GuardJWT.verify(
              {
                foo = {
                  validators = validators.equals_any_of({ "bar", "baz" }),
                  header = "X-DM-Foo"
                }
              },
              {
                secret = "guardjwt",
                is_token_mandatory = false
              }
            )
          ';
    
          proxy_pass http://target/;
        }
      }
    }

上面的示例将

  1. 使用密钥 guardjwt 解密 JWT 令牌

  2. 从密钥 foo 获取声明值

  3. 验证其值是否等于 "bar" 或 "baz"

  4. 将值映射到 X-DM-Foo HTTP 头部。

!GuardJWT 架构图

描述

此库提供了一种简单的方法来将 JWT 令牌中的声明值映射到 HTTP 头部请求。

在底层,此库使用

API - 方法

      local guard = require "guardjwt"

verify_and_map

    syntax: guard.GuardJWT.verify_and_map(claim_spec [, config])

验证来自 "Authorization" 头部的 JTW 令牌,并根据特定规范进行验证。然后,将声明值与其关联的头文件进行映射。

claim_spec 格式

    {
      foo: {
        validators: [resty.jwt-validators] validator.
        header: optional [string] Header name used to map the claim value.
      },
      bar: {
        validators: [resty.jwt-validators] validator.
        header: optional [string] Header name used to map the claim value.
      },
    }

验证器文档可在 SkyLothar 仓库 上直接获取。

config 格式

    {
      secret: [string] which describe private key to decode JWT,
      is_token_mandatory: [bool][default=false] is token is mandatory & valid.
      clear_authorization_header: [bool][default=true] Clear "Authorization" header
    }

secret: 用于解码 JWT 的私钥,如果未提供,则从 JWT_SECRET 环境变量中推断值。is_token_mandatory: 令牌是否必须存在且有效,默认为 false。clear_authorization_header: 清除 "Authorization" 头部,默认为 true。

示例

    local j = require "guardjwt"
    local validators = require "resty.jwt-validators"
    
    j.GuardJWT.verify_and_map(
      {
        foo = {
          validators = validators.equals_any_of({ "bar" }),
          header = "X-DM-Foo"
        }
      },
      {
        secret = "guardjwt",
        is_token_mandatory = true,
        clear_authorization_header = true
      }
    )

raw_verify_and_map

    syntax: guard.GuardJWT.raw_verify_and_map(nginx, claim_spec [, config])

验证来自 "Authorization" 头部的 JTW 令牌,并根据特定规范进行验证。然后,将声明值与其关联的头文件进行映射。

  • nginx: NGINX 对象。

  • claim_spec & config: 上面描述的格式。

示例:网关

您可以通过网关示例 (./example/gateway) 来尝试 guardjwt 模块。

    # Run the target container (Where the traffic will be proxify)
    docker-compose up target
    
    # Run the gateway
    docker-compose up gateway

当两个容器都准备就绪后,您可以向网关发送一个带有 JWT 令牌的 HTTP 请求。

    curl --header 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJmb28iOiJiYXIifQ.DFmxCulxIMpi4fWbVbhnZLCJxvfSb6PhkGDQYsIyOks' http://localhost:8080/

您可以在目标日志中看到 HTTP 请求代理,以及解码后的头文件。

    target_1   | http GET /
    target_1   | host: target
    target_1   | connection: close
    target_1   | user-agent: curl/7.47.1
    target_1   | accept: */*
    target_1   | x-dm-foo: bar

示例:如何在 GuardJWT 上进行开发?

如上所述的方法,您需要先启动目标容器。它将用于处理代理请求。您应该查看日志以调试 guardjwt 模块。

    docker-compose up target

要进行开发,只需更新文件 (./lib/guardjwt.lua) 并执行以下命令。

    make develop-run

作者

Stanislas Chollet (tsunammis)

许可证

mit

依赖项

SkyLothar/lua-resty-jwt >= 0.1.9, luajit >= 2.1.0, ngx_http_lua >= 0.10.6

版本