OAuth2 JWT 认证
介绍
OAuth2 JWT 认证是 OAuth 2.0 身份认证方案中的一种高效实现,它允许客户端通过 JSON Web Token(JWT)进行安全可靠的身份验证。这种方法既保证了安全性,又提高了系统的性能和可扩展性。
OpenResty Edge 为开发者提供了便捷的页面规则动作,使得 OAuth2 JWT 认证的实现变得简单直观。
配置参数
该动作包含以下关键参数:
Key(关键字):
- 探测:输入探测 URL,如
https://accounts.google.com/.well-known/openid-configuration
。这种方式能自动获取 OAuth2 所需的配置信息,包括授权服务器地址、令牌端点和签名公钥等。如您需要生成发现 URL 的内容,可以参考 Google OAuth 2.0 服务的发现 URL中的内容以及查看规范 OpenID Connect Discovery 1.0 incorporating errata set 2 和 OAuth 2.0 Authorization Server Metadata。 - 对称秘钥:输入用于加密和验证 JWT 签名的秘钥。
- 公钥:输入用于验证 JWT 签名的公钥(私钥用于生成签名)。
- 探测:输入探测 URL,如
接受不支持的算法: 默认情况下应保持关闭状态,以拒绝使用不支持算法签名的令牌。开启此选项将导致无法验证令牌签名,存在安全风险。
令牌签名算法: 支持多种算法,包括 HS256、HS512、RS256、RS512、ES256、ES512 和 none。请根据安全需求选择适当的算法。
探测 URL 规范
当选择"探测"作为 Key 类型时,探测 URL 的内容应遵循 OpenID Connect Discovery 1.0 规范:
- 必须使用 HTTPS 协议。
- 标准路径通常为
/.well-known/openid-configuration
。 - 返回的 JSON 文档应包含完整的 OAuth2 和 OpenID Connect 配置信息。
- 关键字段包括
issuer
、authorization_endpoint
、token_endpoint
、jwks_uri
等。
实际应用示例
以下示例展示了如何配置和测试 OAuth2 JWT 认证:
在本例中,我们选择:
- Key 类型:对称秘钥,取值为
openresty
。 - 签名算法:HS256(HMAC with SHA-256)
测试场景
无认证信息请求:
$ curl http://test.com/anything -v ... < HTTP/1.1 403 Forbidden ...
结果:403 状态码,表示访问被禁止。
错误认证信息请求:
$ curl http://test.com/anything -H 'Authorization: Bearer invalid-token' -v ... < HTTP/1.1 403 Forbidden ...
结果:同样返回 403 状态码。
正确认证信息请求:
$ 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 应用中身份验证的优秀选择。