OAuth2 JWT 认证

OAuth2 JWT 认证是 OAuth 2.0 身份认证方案中的一种高效实现,它允许客户端通过 JSON Web Token(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 应用中身份验证的优秀选择。