はじめに
今回はOracle Cloud Infrastructure(OCI)のIAM Identity Domainの機能を使って
API GatewayにOAuth2.0を基盤としたJWT認証をかけたいと思います。
前回、以下の記事でAuth0を利用した認証方法をご紹介しましたが、
今回はOCIのネイティブ機能だけ使った方法を解説します。
【OCI】API Gatewayに認証を実装してみる
https://qiita.com/atwits/items/0774e725c185b3dee890
あとは公式サイトのこのあたりを参考にして頂ければと思います。
https://docs.oracle.com/ja-jp/iaas/Content/Identity/applications/to-configure-oauth.htm
流れに関してはAuth0の時とそれほど変わらないです。
■API GatewayでJWT認証を使うまでの簡単な流れ
①IAM Identity Domainで統合アプリケーションを作成
②API Gatewayでトークンを検証する設定を入れる
③IAM Identity DomainのAPIでトークン発行
④API Gatewayを④のトークンを使ってコールする
今回の構成は下記の通りです。
API Gateway(Functions)の基本機能については前回同様に
過去のQiitaに簡単にまとめてあります。
■【OCI】API Gateway経由でFunctionsのAPIを呼び出してみる
https://qiita.com/atwits/items/f9dcc82f6a552c3df390
◆目次
1.IAM Identity Domainの設定
2.API Gatewayの設定
3.APIの動作検証
1. IAM Identity Domainの設定
それでは早速、IAM Identity Domainの設定に入りたいと思います。
OCIにログインしたら、左上メニュー[Ξ]から
[アイデンティティとセキュリティ] - [ドメイン]を選択します。
次に設定したいドメインを選択します。
(デフォルトのOracleIdentityCloudServiceを選択しても構いません)
ここでは後でAPIのエンドポイントとして使うため、
ドメインURLをコピー(保存)しておき、統合アプリケーションを選択します。
機密アプリケーションを選択して、ワークフローの起動を実行します。
「このアプリケーションをリソース・サーバーとして今すぐ構成します」の
ラジオボタンを選択します。
今回は特に使用しませんのでプライマリ・オーディエンスに任意の値を入れます。
そのまま「このアプリケーションをクライアントとして今すぐ構成します」の
ラジオボタンを選択します。
ここでは下記を選択して次に進みます。
クライアント・タイプ: 機密
IDトークン暗号化アルゴリズム: A256CBC-HS512
クライアントIPアドレス: 任意の場所
認可されたリソース: すべて
最後に「スキップして後で実行」を選択したまま、終了を実行します。
下の方にスクロースするとクライアントID、クライアント・シークレットがあるので
コピーしておきます。
以上でIAM Identity Domainの設定は終了です。
2. API Gatewayの設定
ここでは既にAPI Gateway + Functionsが設定されている前提で
JWT認証を設定する部分を説明したいと思います。
左上メニュー[Ξ]から開発者サービスを選択し、
ゲートウェイを選択します。
ここでは下記の選択/入力をしています。
選択: 単一認証
匿名アクセスの有効化: チェック
認証タイプ: OAuth 2.0 / OpenID Connect
トークンの場所: ヘッダー
JWTトークン・ヘッダー名: Authorization
認証スキーム: Bearer
こちらは下記の選択/入力をしています。
タイプ: リモートJWKS
JWKS URI: [ドメインURL]/admin/v1/SigningCert/jwk
例. https://idcs-263db******.identity.oraclecloud.com/admin/v1/SigningCert/jwk
こちらは下記選択/入力をしています。
許可されている発行者: https://identity.oraclecloud.com/ (固定値)
許可されているオーディエンス: [ドメインURL]
例. https://idcs-263db******.identity.oraclecloud.com
※こちらは前述で設定したオーディエンスではなく、ドメインURLを設定します。
以上で変更の保存を選択したらAPI Gatewayの設定は終了です。
3. APIの動作検証
それでは最後にAPIの動作検証をしてみます。
最初にIAM Identity Domainでアクセストークン(JWT)を発行します。
■設定情報
[Method] POST
[Endpoint] <ドメインURL>/oauth2/v1/token
[Header]
Content-Type: application/x-www-form-urlencoded
Authorization: Basic <Base64認証値>
[Body]
grant_type=client_credentials&scope=urn:opc:idm:__myscopes__
ドメインURL 例. https://idcs-263db******.identity.oraclecloud.com
■Base64認証値の生成方法
例.
クライアントID: ABCDE
クライアント・シークレット: 12345
クライアント・シークレットを「:」でつなげた文字列を作成
→ ABCDE:12345
それをBase64エンコードしたもの
→ QUJDREU6MTIzNDU=
最終的なヘッダーは以下のようなイメージとなります。
Authorization: Basic QUJDREU6MTIzNDU=
上記設定した上でPOSTを実行すると下記のようなレスポンスが返ってきますので
このaccess_tokenをコピーしておきます。
{
"access_token": "eyJ4NXQcN5zdEKfw*****",
"token_type": "Bearer",
"expires_in": 3600
}
あとはAPI Gatewayのヘッダーにトークンを埋め込むだけで完了です。
■設定情報
[Method] POST (任意)
[Endpoint] *API Gatewayのエンドポイント
[Header]
Content-Type: application/json
authorization: Bearer <トークン>
[Body] *API GatewayのPOSTデータ
上記でPOSTすればAPIがコールされます。
※デフォルト設定では3600秒(1時間)経過するとトークンの有効期限が切れて認証エラーとなります。
おわり
以上、IAM Identity DomainのJWT認証を使って簡単にAPI Gatewayに認証を実装することができました。