API Connect OAuth Providerエンドポイント処理を動的に変更する方法

#はじめに

API Connectでは、OAuth 2.0に準拠したエンドポイントを設定するためのOAuth Provider機能が提供されています。基本的な設定は、以下の画面のようにGUIから設定できます。
これらの基本的な設定（エンドユーザーの認証方法や、スコープ、トークンの有効期限など）により、エンドポイント処理は静的な動作になりますが、API Connectでは、このエンドポイント・リソースをカスタマイズすることにより、クライアントからの要求内容に応じた動的な処理を実装することが可能です。この記事では、OAuth Providerの動的な処理要件に対応する方法を紹介いたします（この内容はAPI Connect v10.0.3の環境で検討しています）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/8eb7780d-32a4-26b7-d53c-cca77958f721.png)

[Knowledge Center: OAuth Provider overview](https://www.ibm.com/docs/en/api-connect/10.0.1.x?topic=security-oauth-provider-overview)


# OAuth Providerリソースの設定確認

上記のリソース設定画面の左メニューの「APIエディター」を選択するとOAuth Providerのソースやアセンブルのタブメニューを表示できます。アセンブルタブを表示すると、以下のように基本的な設定に基づいたポリシー処理が設定されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/fbee166b-6cb4-bd53-b2de-f254c910bfd6.png)

デフォルト設定では、主に以下のような処理を行うアセンブル設定になっています。

① OAuthポリシー：OAuth要求の妥当性検査
② 操作切替ロジック：要求パスによるスイッチ（/oauth2/token or /oauth2/authorize or それ以外）
③ OAuthポリシー：許可コード検証、アクセストークン生成
④ ユーザー・セキュリティーポリシー：エンドユーザーの認証
⑤ OAuthポリシー：許可コードの生成
⑥ OAuthポリシー：そのほか、トークン失効等


# OAuth Providerリソースのカスタマイズ

このアセンブル処理はカスタマイズすることが可能です。
今回は、以下のようなカスタマイズ処理を実装する例を紹介します。

1. エンドユーザー認証方法
2. リダイレクトURI 
3. アクセストークンの有効期限

## 1. エンドユーザー認証方法

エンドユーザー認証方式は、OAuth Provider設計に基づいてユーザー・セキュリティーポリシーが設定されています。
例えば、以下の図のように切替ロジック（switch）を利用して認証方式を変更することができます。この例では、要求HTTPヘッダーに「client-type:1」を含む場合とそれ以外で分けています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/b7a6876a-60d7-c8d3-7c5f-d7a669de3c0d.png)

ユーザー・セキュリティーポリシーの設定方法は、OAuth Providerリソースの設計項目と同様に設定できますので、スイッチ条件ごとにエンドユーザー認証方法を変更することができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/7fc2ad55-b7f5-f136-f79e-4ff37bf8ad05.png)

## 2. リダイレクトURI

許可コードの生成は、⑤のOAuthポリシーで実行されます。許可コードに関連するリダイレクトURIなどの情報は、OAuthコンテキスト変数（oauth.processing.redirect_uriなど）を利用してオーバーライドすることが可能です。

[Knowledge Center:OAuth context variables - Processing variables](https://www.ibm.com/docs/en/api-connect/10.0.1.x?topic=reference-oauth-context-variables)

以下の例では、⑤の前にGatewayScriptポリシーで「oauth.processing.redirect_uri」をオーバーライドする設定を入れています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/4f7c581f-ebc4-3570-e8b9-3cfb40200132.png)


以下に実行例を示します。要求ではredirect_uriで、「 https://example.com/redirect 」としていますが、応答では、Locationヘッダーから「 http://example.com/site1 」に許可コードを戻していることを確認できます。

```
$ curl -k -i -u test:test -X GET \
>   --url 'https://ademo-gw-gateway-cp4i/demo-org/sandbox/v1/customize/oauth2/authorize?response_type=code&scope=scope1&redirect_uri=https://example.com/redirect&client_id=2625aedb59f903d64a8e4d59faed8391'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
HTTP/1.1 302 Found
Connection: Keep-Alive
Transfer-Encoding: chunked
User-Agent: curl/7.55.1
Accept: */*
Location: http://example.com/site1?code=AAJf7ORKR_PuEYjsAfiq5oxDKhz0WoGXzgPZgCWWoAd-HL82sFCCELkNpbprnNv7UgOznWvK4dXa6wNjPHZXTcip

```

## 3. アクセストークンの有効期限

アクセストークンの生成は②のOAuthポリシーで実施していますので、こちらをカスタマイズしていきます。
アクセストークンの有効期限はOAuth Providerリソースのデフォルト設定となるため、OAuthポリシーのリテラル・ストリングからの動的OAuth構成から設定できます。以下のマニュアルを参考に、有効期限を200秒にオーバーライドします。

[Knowledge Center: Overriding the default OAuth provider settings](https://www.ibm.com/docs/en/api-connect/10.0.1.x?topic=policies-oauth)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/403443/26a633c2-e42c-f9d6-765d-ef2cbce766df.png)


以下に実行例を示します。OAuth Provider設定では、アクセストークンの有効期限をデフォルトの3600としていますが、応答結果では、expires_inが200となっています。

```
$ curl -ki  -u '2625aedb59f903d64a8e4d59faed8391':'***' -X POST \
>   --url https://ademo-gw-gateway-cp4i/demo-org/sandbox/v1/customize/oauth2/token \
>   -d 'grant_type=authorization_code&redirect_uri=https://example.com/redirect&code=AAKyqtDd9N9skxUlchvlxw-kQTVG-NbywFuemtXNOYhyVYroClmbhKKFegeBbkFXwCgprmyAm7UsWM6DtOgYUyq6'
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   398    0   233  100   165    233    165  0:00:01 --:--:--  0:00:01   471
HTTP/1.1 200 OK
Connection: Keep-Alive
Transfer-Encoding: chunked
User-Agent: curl/7.55.1

{"token_type":"Bearer","access_token":"***gMjYyNWFlZGI1OWY5MDNkNjRhOGU0ZDU5ZmFlZDgzOTGh39y_E1MW7x_DS5PA3dRLwzTdQnNnjRMYN3pJJKgpUUHPZ5x_DJB3d52STHeB7bI33gTrZXS9XLR9P8L5z***","scope":"scope1","expires_in":200,"consented_on":1637834913}
```


以上です。