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)。