0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【OCI】IAM Identity Domainを使ってAPI Gatewayに認証を実装してみる

Last updated at Posted at 2025-01-20

はじめに

今回は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を④のトークンを使ってコールする

今回の構成は下記の通りです。

■構成
image.png

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にログインしたら、左上メニュー[Ξ]から
[アイデンティティとセキュリティ] - [ドメイン]を選択します。
image.png

次に設定したいドメインを選択します。
(デフォルトのOracleIdentityCloudServiceを選択しても構いません)
image.png

ここでは後でAPIのエンドポイントとして使うため、
ドメインURLをコピー(保存)しておき、統合アプリケーションを選択します。
image.png

続いてアプリケーションの追加を実行します。
image.png

機密アプリケーションを選択して、ワークフローの起動を実行します。
image.png

任意の名前(ここではapp_jwt)をつけて次を押します。
image.png

「このアプリケーションをリソース・サーバーとして今すぐ構成します」の
ラジオボタンを選択します。
image.png

今回は特に使用しませんのでプライマリ・オーディエンスに任意の値を入れます。
image.png

そのまま「このアプリケーションをクライアントとして今すぐ構成します」の
ラジオボタンを選択します。
image.png

クライアント資格証明とJWTアサーションを選択します。
image.png

ここでは下記を選択して次に進みます。
クライアント・タイプ: 機密
IDトークン暗号化アルゴリズム: A256CBC-HS512
クライアントIPアドレス: 任意の場所
認可されたリソース: すべて
image.png

最後に「スキップして後で実行」を選択したまま、終了を実行します。
image.png

統合アプリケーションの作成が完了したらアクティブ化します。
image.png

下の方にスクロースするとクライアントID、クライアント・シークレットがあるので
コピーしておきます。
image.png

以上でIAM Identity Domainの設定は終了です。

2. API Gatewayの設定

ここでは既にAPI Gateway + Functionsが設定されている前提で
JWT認証を設定する部分を説明したいと思います。

左上メニュー[Ξ]から開発者サービスを選択し、
ゲートウェイを選択します。

image.png

あとは認証設定したいAPI Gatewayを選択します。
image.png

続いてデプロイメントを選択します。
image.png

ここで編集を選択します。
image.png

下記の通り、赤枠部分の通りとします。
image.png

ここでは下記の選択/入力をしています。
選択: 単一認証
匿名アクセスの有効化: チェック
認証タイプ: OAuth 2.0 / OpenID Connect
トークンの場所: ヘッダー
JWTトークン・ヘッダー名: Authorization
認証スキーム: Bearer

下にスクロールして下記の赤枠も選択/入力します。
image.png

こちらは下記の選択/入力をしています。
タイプ: リモートJWKS
JWKS URI: [ドメインURL]/admin/v1/SigningCert/jwk
例. https://idcs-263db******.identity.oraclecloud.com/admin/v1/SigningCert/jwk

さらにスクロールして下記の赤枠も選択/入力します。
image.png

こちらは下記選択/入力をしています。
許可されている発行者: 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データ

image.png

上記でPOSTすればAPIがコールされます。
※デフォルト設定では3600秒(1時間)経過するとトークンの有効期限が切れて認証エラーとなります。

おわり

以上、IAM Identity DomainのJWT認証を使って簡単にAPI Gatewayに認証を実装することができました。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?