Auth0向けにSwagger UIのOAuth2 Client Credentialフローで'audience'パラメーターも送信する
背景
業務でAuth0とOpenAPIやSwagger UIを利用しています。
OpenAPIの定義でOAuth2 Client CredentialでTokenUrlを記述できますが、Auth0ではaudienceパラメーターの指定が必要です。(トークン取得API仕様参照)
現在最新のSwagger UI v5.17.14では任意に指定することが出来ず403エラーになってしまうのでカスタマイズを試みました。
「Auth0 audience Swagger UI」で検索するとAuth0 Communityで似た報告を閲覧することができますが、ASP.NET CoreやSpring Bootを組み合わせたり、クエリストリングで指定する方法が見られます。いっそのことSwagger UI側を直接改修しました。
個人的な興味本位の調査の一環であり業務で採用するかどうかはわかりません。
動作環境
- macOS Sequoia
- Apple Silicon
- Swagger UI v5.17.14
- Docker Desktop 4.34.3 (170107)
image: node:22.9.0-alpine3.20を利用していますが、この記事では触れません。
Swagger UIの開発環境をホストOSに構築したくなかったため利用しています。
OSSを改修
Swagger UI v5.17.14から改修します。Reactの実務経験はないので詰めが甘いコードだと思いますが、コードを見て頂くのが一番分かり易いと思います。
デバッグ実行
oauth2 clientCredentialsでOpenAPIを定義します。tokenURL
はトークン取得APIです。
securitySchemes:
petstore_auth:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://dev-***************.us.auth0.com/oauth/token
npm run dev
を実行します。
Swagger UIのページを確認
該当のエンドポイントの🔓マークから認証情報を確認します。audience
パラメーターが増えています。
Client ID / Client Secret / Identifier(audience)を入力してAuthorize
ボタンを押します。
Auth0 トークン取得APIからトークンが取得できました。
- レスポンス
- リクエスト audienceが含まれる
- トークンのレスポンス値
もし、CORSのエラーが出る場合はAuth0 Application設定でオリジンを設定します。
動作確認できればnpm run build
でビルドして利用すれば良いと思います。
[補足] 独自プロパティで制御する
上記の方法ではaudience
パラメーターが一律表示されるようになります。個別に指定する方法としてx-needAudience
という独自プロパティで制御できそうだと思ったので興味本位でやってみました。
OpenAPIを定義でx-needAudience: true
のときのみ、audience
パラメーターのテキストボックスが出現するようになります。
securitySchemes:
petstore_auth:
type: oauth2
flows:
clientCredentials:
tokenUrl: https://dev-***************.us.auth0.com/oauth/token
x-needAudience: true
余談
時間と理解の関係でテストコードは書いていませんが、書けたらご本家に提案してみるかもしれません。今回はコントリビューションを目的としていないので勝手にForkして改修していますが、ご本家では一度議論してからPRして欲しいと記載がありました。
Discussion