1
Help us understand the problem. What are the problem?

posted at

updated at

Oracle Identity Cloud ~ 認証からユーザー情報の参照までのシーケンス

はじめに

Oracle Identity Cloud の Confidential Application で認証からユーザー/グループ情報の参照までに複数回リクエストを送る必要があり、備忘も兼ねて一連の処理シーケンスを整理してみました。

Python で書いたサンプル・コードはこちらにあります。

ドキュメンテーションは、この辺りが参考になると思います。
認証APIを使用したアクセス・トークンの生成

手順

Step 0: OAuthアクセストークンを取得する

POST {{tenant_url}}/oauth2/v1/token

[必要な入力]
client_id, client_secret

url = idcs_url + '/oauth2/v1/token'
headers = {'content-type': 'application/x-www-form-urlencoded'}
payload = {'grant_type' : 'client_credentials', 'scope' : 'urn:opc:idm:__myscopes__'}
response = requests.post(url, data=urllib.parse.urlencode(payload), headers=headers, auth=(client_id, client_secret))

[後続の処理で使うもの]
access_token = response.json().get("access_token")

Step 1: 認証フローを開始する

GET {{tenant_url}}/sso/v1/sdk/authenticate?appName={{appName}}

[必要な入力]
access_token, app_name

url = idcs_url + '/sso/v1/sdk/authenticate'
headers = {'Authorization': 'Bearer ' + access_token}
paramas = {'appName' : app_name}
response = requests.get(url, headers=headers, params=paramas)

[後続の処理で使うもの]
request_state = response.json().get('requestState')

Step 2: ユーザー資格証明(ID/PW)をサブミットする

POST {{tenant_url}}/sso/v1/sdk/authenticate

[必要な入力]
access_token, request_state, username, password

url = idcs_url + '/sso/v1/sdk/authenticate'
headers = {'Authorization': 'Bearer ' + access_token}
payload = {
   'op': 'credSubmit',
   'credentials':{  
      'username' : username,
      'password' : password
   },
   'requestState' : request_state
}
paramas = {'appName' : app_name}
response = requests.post(url, headers=headers, json=payload)

[後続の処理で使うもの]
auth_token = response.json().get('authnToken')

Step 3: ユーザのアクセス・トークンを取得する

POST {{tenant_url}}/oauth2/v1/token

[必要な入力]
client_id, client_secret, auth_token

url = idcs_url + '/oauth2/v1/token'
headers = {'content-type': 'application/x-www-form-urlencoded'}
payload = {
    'grant_type' : 'urn:ietf:params:oauth:grant-type:jwt-bearer', 
    'scope' : 'urn:opc:idm:__myscopes__',
    'assertion' : auth_token
}
response = requests.post(url, data=urllib.parse.urlencode(payload), headers=headers, auth=(client_id, client_secret))

[後続の処理で使うもの]
my_access_token = response.json().get("access_token")

Step 4: ユーザ情報を取得する / ユーザが属するグループ情報を取得する

GET {{tenant_url}}/admin/v1/Me

[必要な入力]
my_access_token

url = idcs_url + '/admin/v1/Me'
headers = {'Authorization': 'Bearer ' + my_access_token}
response = requests.get(url, headers=headers)

GET {{tenant_url}}/admin/v1/MyGroups

url = idcs_url + '/admin/v1/MyGroups'
headers = {'Authorization': 'Bearer ' + my_access_token}
response = requests.get(url, headers=headers)
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
1
Help us understand the problem. What are the problem?