Okta Access Requests v1 API を使ってRequest Typeを作成してみた

Okta Access Requests v1 API を使ってRequest Typeを作成してみた

Clock Icon2025.07.20

Okta Access Requests は、ユーザーが SaaS アプリやグループなどのリソースに対してアクセス申請を行い、承認フローを経てアクセス権限を取得できる機能です。これにより、従来は情シスや管理者が手動で行っていたアクセス権の付与・削除を、自動化・効率化することができます。

詳しい概要は以下の記事をご覧ください

https://dev.classmethod.jp/articles/okta-access-requests/

通常、この承認ワークフローはOkta管理画面(GUI)から手動で作成しますが、APIで作成することもできます。

https://developer.okta.com/docs/api/iga/openapi/governance.requests.admin.v1/tag/Request-Types/#tag/Request-Types/operation/createRequestType

モチベーション

通常、Okta Access Requests の承認ワークフロー(Request Type)は、Okta 管理画面(GUI)から作成します。しかし、以下のようなケースでは、API 経由で動的に Request Type を作成したくなります。

  • AWS IAM Identity Center(旧 AWS SSO)と Okta が SCIM 連携している環境で、AWS Lambda などから動的に IDC グループが作成される
  • その新しいグループへの一時的な所属申請を、Okta Access Requests を通じて行いたい
  • 毎回情シスが手動で Request Type を作成するのは手間であり、自動化したい

このようなケースでは、Okta Access Requests の v1 API を使って Request Type を自動作成することで、情シスの負荷軽減と運用効率の向上が期待できます。

APIリクエスト

以下は、Okta Access Requests v1 API を使用して Request Type を作成する curl コマンドの例です。

この例は、DeveloperグループからAdminグループに一時的に移動(権限昇格)する承認ワークフローです。

API_TOKEN={Okta管理画面から発行したAPIトークン}
OKTA_DOMAIN={Oktaテナントのドメイン}

AUTH_HEADER="Authorization: SSWS ${API_TOKEN}"
CONTENT_TYPE_JSON="Content-Type: application/json"
ACCEPT_JSON="Accept: application/json"

# Request Type の ownerId (GET /governance/api/v1/teams 等で取得)
REQUEST_TYPE_OWNER_ID={リクエストタイプの管理Team}

# OktaグループのグループID 管理画面のURL等から取得
DEVELOPER_GROUP_ID={OktaグループID}
ADMIN_GROUP_ID={OktaグループID}
curl -v -X POST "https://${OKTA_DOMAIN}/governance/api/v1/request-types" \
-H "${AUTH_HEADER}" \
-H "${CONTENT_TYPE_JSON}" \
-H "${ACCEPT_JSON}" \
-d '{
  "name": "'"${ENVIRONMENT_IDENTIFIER}"' developer から admin への一時的昇格",
  "description": "DeveloperロールからAdminロールへ一時的に昇格するリクエスト",
  "ownerId": "'"${REQUEST_TYPE_OWNER_ID}"'",
  "resourceSettings": {
    "type": "GROUPS",
    "targetResources": [
      {
        "resourceId": "'"${ADMIN_GROUP_ID}"'"
      }
    ]
  },
  "requestSettings": {
    "type": "MEMBER_OF",
    "requesterMemberOf": ["'"${DEVELOPER_GROUP_ID}"'"],
    "requesterFields": [
      {
        "id": "duration",
        "label": "昇格期間(時間)",
        "prompt": "昇格期間(時間)を選択してください",
        "type": "SELECT",
        "options": [{"value": "1"}, {"value": "2"}, {"value": "4"}, {"value": "8"}],
        "required": true
      },
      {
        "id": "reason",
        "label": "昇格理由",
        "prompt": "昇格理由を入力してください",
        "type": "TEXT",
        "required": true
      }
    ]
  },
  "approvalSettings": {
    "type": "SERIAL",
    "approvals": [
      {
        "approverType": "MEMBER_OF",
        "approverMemberOf": ["'"${ADMIN_GROUP_ID}"'"],
        "description": "Adminグループによる承認"
      }
    ]
  },
  "accessDuration": "PT8H",
  "status": "ACTIVE"
}'

さいごに

「公式ドキュメントを見れば分かる」という声が聞こえてきそうですが、実際に試してみると挙動が分かりにくいポイントがいくつかありました。

今回、私が実際にAPIを使ってRequest Typeを作成した例を共有することで、誰かの参考になれば幸いです。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.