OAuth2 Introspection 认证
介绍
OAuth2 Introspection 认证用于验证访问令牌(例如 JWT)的有效性。它允许资源服务器在收到客户端的请求时,询问授权服务器令牌的有效性。授权服务器验证令牌,并返回关于令牌的详细信息,例如所有者、有效期和范围。
OAuth2 Introspection 认证的目的是确保令牌安全地流通,并且只有经过认证的客户端才能访问受保护的资源。它是一种有效的令牌验证技术,适用于保护私人和敏感数据。
OpenResty Edge 中提供了对应的页面规则动作来实现此功能。
这个动作有以下参数:
- 终端:验证令牌有效性的 API 端点。它可以接收令牌,并返回有关该令牌的详细信息,例如它是否有效、关联的用户以及它的权限。这个端点可以用于帮助验证令牌是否合法,以确保请求者拥有足够的权限访问特定资源。
- 客户 ID:客户端应用程序的唯一标识符,授权服务器使用它来识别客户端。
- 客户秘钥:用于验证客户端应用程序的共享密码。它是保密的,用于在向授权服务器发出请求时证明客户端应用程序的身份。它用于防止对受保护资源的未授权访问。
- SSL 验证:指定访问终端时是否开启 SSL 验证。
示例
创建验证令牌的终端
由于需要一个验证令牌的终端,我们在 Edge 上新建一个应用来模拟终端。
这个应用我们勾选“Load application by IP addresses (没有 Host 请求头,不支持 HTTPS)”,目的是避免需要绑定域名,用 IP 来访问到这个应用。
然后新建一个页面规则,当URI 中前缀匹配到 /oauth2-introspect
后,返回正确的信息:
再新建另一个页面规则,返回错误的信息,目的是使 OAuth2 Introspection 认证失败:
启用 OAuth2 Introspection 认证
- 终端使用:http://192.168.50.220/bad-oauth2-introspect,其中 192.168.50.220(仅用于示例) 为示例中使用的 Edge Node 的 IP。
- 注意:这里使用的 URI 是
/bad-oauth2-introspect
,也就是会命中终端的第二条页面规则,返回错误的令牌信息。
- 注意:这里使用的 URI 是
- 客户 ID 及客户秘钥都使用:openresty(仅用于示例)。
- SSL 验证:演示用使用的是 HTTP 而非 HTTPS,因此这个选项关闭即可。
然后我们发送测试请求:
$ curl http://test.com/anything -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ._FOTfoCTzKHWcBDYf1rfRkg-g6D_Mg8dnccLR_geCH0' -v
...
< HTTP/1.1 403 Forbidden
...
可以看到返回了 403 状态码,表示没有通过终端的验证。
然后修改页面规则,使用正确的 URI /oauth2-introspect
:
再次发送测试请求:
$ curl http://test.com/anything -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJmb28iOiJiYXIifQ._FOTfoCTzKHWcBDYf1rfRkg-g6D_Mg8dnccLR_geCH0' -v
...
< HTTP/1.1 404 Not Found
...
返回了 404 而没有返回 403,表示已经通过了认证,但请求访问了不存在的资源(/anything)。