OAuth2 JWT 认证

介绍

OAuth2 JWT 认证是 OAuth 2.0 身份认证方案中的一种高效实现,它允许客户端通过 JSON Web Token(JWT)进行安全可靠的身份验证。这种方法既保证了安全性,又提高了系统的性能和可扩展性。

OpenResty Edge 为开发者提供了便捷的页面规则动作,使得 OAuth2 JWT 认证的实现变得简单直观。

OAuth2 JWT 认证设置界面

配置参数

该动作包含以下关键参数:

  1. Key(关键字)

  2. 接受不支持的算法: 默认情况下应保持关闭状态,以拒绝使用不支持算法签名的令牌。开启此选项将导致无法验证令牌签名,存在安全风险。

  3. 令牌签名算法: 支持多种算法,包括 HS256、HS512、RS256、RS512、ES256、ES512 和 none。请根据安全需求选择适当的算法。

探测 URL 规范

当选择"探测"作为 Key 类型时,探测 URL 的内容应遵循 OpenID Connect Discovery 1.0 规范:

  1. 必须使用 HTTPS 协议。
  2. 标准路径通常为 /.well-known/openid-configuration
  3. 返回的 JSON 文档应包含完整的 OAuth2 和 OpenID Connect 配置信息。
  4. 关键字段包括 issuerauthorization_endpointtoken_endpointjwks_uri 等。

实际应用示例

以下示例展示了如何配置和测试 OAuth2 JWT 认证:

OAuth2 JWT 认证配置示例

在本例中,我们选择:

  • Key 类型:对称秘钥,取值为 openresty
  • 签名算法:HS256(HMAC with SHA-256)

测试场景

  1. 无认证信息请求

    $ curl http://test.com/anything -v
    ...
    < HTTP/1.1 403 Forbidden
    ...
    

    结果:403 状态码,表示访问被禁止。

  2. 错误认证信息请求

    $ curl http://test.com/anything -H 'Authorization: Bearer invalid-token' -v
    ...
    < HTTP/1.1 403 Forbidden
    ...
    

    结果:同样返回 403 状态码。

  3. 正确认证信息请求

    $ curl http://test.com/anything -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ._FOTfoCTzKHWcBDYf1rfRkg-g6D_Mg8dnccLR_geCH0' -v
    ...
    < HTTP/1.1 404 Not Found
    ...
    

    结果:返回 404,表明认证成功,但请求的资源不存在。

JWT Token 生成示例

以下是一个使用 Lua 生成 JWT token 的示例代码:

文件名:jwt-example.lua

local jwt = require "resty.jwt"

-- set up the payload
local payload = {
    iss = "your_issuer",
    sub = "user_id",
    exp = ngx.time() + 3600,  -- expires in 1 hour
    iat = ngx.time(),
    -- other custom fields
}

-- sign with a symmetric key
local jwt_token = jwt:sign(
    "openresty",  -- Your secret key
    {
        header = {typ = "JWT", alg = "HS256"},
        payload = payload
    }
)

ngx.say(jwt_token)

运行命令:

/usr/local/openresty-utils/bin/resty2 jwt-example.lua

这个示例使用 resty.jwt 库生成 JWT token,设置了常见的 claims 如 iss(发行者)、sub(主题)、exp(过期时间)和 iat(签发时间)。你可以根据具体需求添加其他自定义字段。

注意:示例中使用了 HS256 算法和对称密钥。在生产环境中,请确保使用足够复杂的密钥,并采取适当的措施保护密钥安全。

通过这种方式实现的 OAuth2 JWT 认证,既保证了安全性,又提高了系统效率,是现代 Web 应用中身份验证的优秀选择。