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,也就是会命中终端的第二条页面规则,返回错误的令牌信息。
  • 客户 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)。