## Collabo IDの概要
Collabo IDは、OpenID Connectプロトコルを利用することで、一般的なSSO連携のように連携先アプリケーションのID基盤そのものを置き換えるのではなく、連携先アプリケーション既存のログイン方式は残した上で連携を行うことが可能です。
Collabo IDは、医療専用のID管理SaaS機能を提供するDoctors DX Utilityを用いて動作します。これにより、OpenID Connectに準拠したフローとなっており、Collabo IDと連携する際はOAuth2.0で保護されたAPIを用いてセキュアな連携を行うことが可能です。
## 連携処理概要
連携を行った際の具体的なフローとして、ユーザ目線で見た際のログインフローを記載します。
1. Collabo ID経由で連携先アプリケーションのログイン画面に遷移する
2. 通常通り連携先アプリケーションのログイン画面にID・パスワードを入力する
3. ログイン成功する(Collabo IDと連携先アプリケーションの連携処理を行う)
4. 連携先アプリケーションからログアウトする
5. Collabo ID経由で連携先アプリケーションのログイン画面に遷移する(2度目)
6. 連携先アプリケーションのログイン画面を表示することなくログイン状態とする
つまり、`3.`の時点でCollabo IDとの連携処理を行い、それ以降はパスワードの再入力をすることなくログインできる形を実現します。
<div style="page-break-before:always"></div>
## 連携処理フロー
```plantuml
@startuml login
skinparam actorStyle awesome
actor "ユーザ" as user
participant "連携先アプリ" as thirdparty
' participant "Welby" as thirdparty
' box ドクターズDXユーティリティ
box Collabo ID
participant "Collabo Portal" as suzukenPF
participant "ログイン管理API" as loginAPI
database "データベース" as db
end box
user -> suzukenPF: ログイン
activate suzukenPF
user <-- suzukenPF:
deactivate suzukenPF
==初回ログイン==
user -> suzukenPF: 連携先アプリアプリを開きたい\n(ランチャーのアプリをクリック)
activate suzukenPF
user <-- suzukenPF: 通常ログインURLを案内
deactivate suzukenPF
user -> thirdparty: 通常のログイン画面を開く
activate thirdparty
' user <-- thirdparty: ログイン連携しますか?
' user -> thirdparty: はい
user <-- thirdparty: ログイン画面
user -> thirdparty: ID・パスワード入力
user <-- thirdparty: OK
thirdparty -> loginAPI: 連携登録リクエスト
activate loginAPI
loginAPI -> db: 連携情報記録
activate db
loginAPI <-- db: OK
deactivate db
thirdparty <-- loginAPI: OK
user <-- thirdparty: ログイン完了
deactivate loginAPI
deactivate thirdparty
==初回以降ログイン==
skinparam actorStyle awesome
user -> suzukenPF: 連携先アプリアプリを開きたい\n(ランチャーのアプリをクリック)
activate suzukenPF
user <-- suzukenPF: 連携済みログインURLを案内
deactivate suzukenPF
user -> thirdparty: 連携済みログインURLを開く
activate thirdparty
thirdparty -> loginAPI: ユーザは連携済みか?
activate loginAPI
loginAPI -> db: ユーザの連携状態確認
activate db
loginAPI <-- db: 連携済み
deactivate db
thirdparty <-- loginAPI: YES
deactivate loginAPI
thirdparty -> thirdparty: ログイン状態にする
user <-- thirdparty: ログイン完了
deactivate thirdparty
@enduml
```
<div style="page-break-before:always"></div>
## Collabo IDとの連携準備
<!-- ## 概要
連携のためには以下を実装頂く必要があります
1. Collabo IDとの連携用エンドポイントの作成(以下2つ)
- Collabo IDとの連携時のログイン開始処理
- Collabo IDと連携済みの場合に自動ログイン処理
2. 既存のログイン処理の変更
- Collabo IDから渡された認証情報の受け渡し処理の追加
3. Collabo IDが提供するAPIの呼び出し処理
4. Collabo ID蓮馨寺に強制的にログイン状態とする処理 -->
<!-- ## Collabo IDとの連携準備 -->
Collabo IDと連携する際は以下の情報連携が必要となります。
1. こちらから事前にお渡しする情報
2. 組込みのために提供いただく情報
### 1. 事前にお渡しする情報
Collabo IDから発行される以下の情報をご提供いたします。
これらはOpenID ConnectやOAuth2.0を利用する際に必要となるclient_id, client_secretと同様の方法で利用します
- ISSUER
- CLIENT_ID
- CLIENT_SECRET
- AUDIENCE
これらの情報は連携するアプリケーションごとに発行の必要があるため、導入決まり次第こちらで発行してご案内いたします
### 2. 提供頂く情報
後述する[作成するエンドポイント一覧](#作成するエンドポイント一覧)で作成いただく3つのエンドポイントのURLをご提供いただきます。
本連携方法ではOpenID Connectの仕様に沿ったフローで連携処理を行うため、これらのURLを事前に設定しておく必要があるためです。
作成するURLが決まり次第ご提供よろしくお願いいたします。
<div style="page-break-before:always"></div>
# 組込み方法
<!-- ## 概要
連携のためには以下を実装頂く必要があります
1. Collabo IDとの連携用エンドポイントの作成(以下2つ)
- Collabo IDとの連携時のログイン開始処理
- Collabo IDと連携済みの場合に自動ログイン処理
2. 既存のログイン処理の変更
- Collabo IDから渡された認証情報の受け渡し処理の追加
3. Collabo IDが提供するAPIの呼び出し処理
4. Collabo ID蓮馨寺に強制的にログイン状態とする処理 -->
## 組込みにあたっての工程
Collabo IDの組込みの際には以下の工程を想定しています。
1. Collabo IDよりステージング環境の連携情報を払い出す
2. ステージング環境での組込みテストを実施いただく
3. Collabo IDより本番環境の連携情報を払い出す
4. 本番環境への切り替えを行っていただく
連携先の切り替えは[事前にお渡しする情報](#事前にお渡しする情報)で記載した4つの項目を切り替えることで行います。
これらの情報はステージング環境向け、本番環境向けそれぞれで払い出しさせていただく形となりますので、環境変数等でこれらの情報変更できるようにしていただけば、ソースコードの変更なしで環境の切り替えが可能です。
ただし、ステージング環境でテストする場合と本番環境に組込む場合で貴社システムのURLが異なる場合はそれぞれ設定が必要となるため、改めてご連絡頂きますようお願いします
<div style="page-break-before:always"></div>
## 詳細フロー
各サービス間の実装内容を含めた詳細なフローが以下となります。(以下はステージング環境において実施した場合です)
```plantuml
skinparam actorStyle awesome
actor "ユーザ" as user
participant "連携先アプリ" as thirdparty
box Collabo ID
participant "Collabo Portal" as suzukenPF
participant "ログイン管理API" as loginAPI
end box
user -> suzukenPF: ログイン
activate suzukenPF
user <-- suzukenPF: ログイン開始エンドポイントへのログインURL
deactivate suzukenPF
user -> thirdparty: ログイン開始**エンドポイント**
activate thirdparty
thirdparty -> thirdparty: ランダムなstateをセッションに保存
user <-- thirdparty: 302 リダイレクト \n https://stg-id.dx-utility.com/management/api/v1/login/redirect/\n?user_id=${ユーザID}&client_id=${クライアントID}&state=${ステート}
deactivate thirdparty
user -> loginAPI: アクセス
activate loginAPI
note over loginAPI: 連携済・未連携の判定
alt 未連携
user <-- loginAPI: 302 リダイレクト\n通常ログインページ(https://app1.example.com/login?code=egwijaopgaj&state=faewfawef0awe0)
else 連携済
user <-- loginAPI: 302 リダイレクト\n連携済みログインページ(https://app1.example.com/login_integrated?code=egwijaopgaj&state=faewfawef0awe0)
end
deactivate loginAPI
alt 未連携
user -> thirdparty: 通常ログインページ\nhttps://app1.example.com/login\nQueryParameter \ncode=egwijaopgaj\nstate=faewfawef0awe0
activate thirdparty
user <-- thirdparty: ログインページ表示
user -> thirdparty: ID・パスワード送信\n code,stateも合わせてサーバ側に送信する
note over thirdparty: code, stateを既存のHTTPのリクエストに含めるか\nHTTPのセッションへ保持する形でサーバへ送信してください
group stateの検証
thirdparty -> thirdparty: stateと\n最初にセッションに保存したstateを比較する
opt 一致しない場合
note over thirdparty: ログイン処理中断
user <-- thirdparty: エラーページ表示
end
end
thirdparty -> loginAPI: アクセストークンの取得(渡されたcodeをリクエストに含める)
activate loginAPI
thirdparty <-- loginAPI: アクセストークン
thirdparty -> loginAPI: 連携API POST\nhttps://stg-id.dx-utility.com/management/api/v1/login/register\nBody:{"userId": "1013"}\n"Header: {Authorization: Bearer ${アクセストークン}}"
thirdparty <-- loginAPI: {"result": true, "userId": "1013"}
deactivate loginAPI
user <-- thirdparty: ログイン済ページ表示
deactivate thirdparty
else 連携済
user -> thirdparty: 連携済みログインページ\nhttps://app1.example.com/login_integrated\nQueryParameter \ncode=egwijaopgaj\nstate=faewfawef0awe0
activate thirdparty
group stateの検証
thirdparty -> thirdparty: クエリに含まれるstateと\n最初にセッションに保存したstateを比較する
opt 一致しない場合
note over thirdparty: ログイン処理中断
user <-- thirdparty: エラーページ表示
end
end
thirdparty -> loginAPI: アクセストークンの取得(渡されたcodeをリクエストに含める)
activate loginAPI
thirdparty <-- loginAPI: アクセストークン
thirdparty -> loginAPI: 連携済ユーザ取得API POST \nhttps://stg-id.dx-utility.com/management/api/v1/login/authorize\n"Header: {Authorization: Bearer ${アクセストークン}}"
thirdparty <-- loginAPI: {"applicationId": "${client_id}", "userId": "1013"}
deactivate loginAPI
thirdparty -> thirdparty: 返却されたuserIdのユーザとしてログイン状態とする
user <-- thirdparty: ログイン済ページ表示
deactivate thirdparty
end
```
<div style="page-break-before:always"></div>
## Collabo IDとの連携用エンドポイントの作成
連携のために3つのエンドポイントを作成および既存の機能の拡張を実装していただきます。
このエンドポイントとはWebシステムにおけるAPIのURIと同様のものを指しています。
OpenID ConnectのフローにしたがってWebブラウザが各エンドポイントをリダイレクトを繰り返す処理となります。
その結果、取得した情報をコールバックの形で連携先アプリに引き渡すような処理となります。
Webシステムの場合は通常通りエンドポイントを追加していただく形になります。
連携するシステムがネイティブアプリの場合は以下の手順を参考に組込みをお願いいたします。
- Android
- https://developer.android.com/training/basics/intents/filters?hl=ja
- iOS
- https://developer.apple.com/documentation/xcode/defining-a-custom-url-scheme-for-your-app
### 作成するエンドポイント一覧
以下の3つのエンドポイントを追加・更新いただきます。
| エンドポイント| 新規 / 既存拡張 | 形式 | 役割 |
| --- | --- |--- | --- |
| ログイン開始 | 新規 | API | Collabo IDとの連携 |
| 未連携時エンドポイント| 既存拡張 | 画面 | 既存のログイン画面に対して連携に必要な処理を追加いただく |
| 連携済時エンドポイント| 新規 | API | 連携済みの際に自動的にログイン状態とする |
次からそれぞれの処理の詳細について記載します。
<div style="page-break-before:always"></div>
### ログイン開始エンドポイントの作成
ログイン開始エンドポイントではCollabo IDへのリダイレクト処理を行っていただきます。
また、その際にCSRF対策として後述のstateによる対策を実施いただきます。
連携処理の概要は以下の通りです
1. ランダムな`state`文字列を発行する
2. `state`をセッションに保存する
3. Collabo IDの所定のURIへリダイレクトする
#### stateの発行と保存
stateは英数字(記号含まず)のランダムな文字列を発行してください
発行したstateはwebブラウザのセッション、あるいはCookie等のユーザ毎に保持される領域へ保存してください
#### Collabo IDへのリダイレクト
stateをセッションへ保存できたら、以下のようなURIへリダイレクトしてください。
ネイティブアプリの場合はリダイレクト先のURLをブラウザアプリに開いていただきます。
```
https://stg-id.dx-utility.com/management/api/v1/login/redirect/?user_id=${ユーザID}&client_id=${クライアントID}&state=${ステート}
```
指定するクエリ部は以下の情報を指定してください
`user_id`についてはログイン開始エンドポイントへのクエリパラメーターとして渡されるため、その情報をそのまま渡します
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| user_id | ログイン開始エンドポイントを開く際に渡される`user_id`部 | 必須 |
| client_id | [事前にお渡しする情報のclient_id](#事前にお渡しする情報) | 必須 |
| state | 生成したランダム文字列 | 必須 |
上記へのリダイレクト後、Collabo IDとの連携済みか否かに応じて以下のエンドポイントへ戻ります
- [未連携ユーザ向けエンドポイント](#未連携ユーザ向けエンドポイント)
- [連携済みユーザ向けエンドポイント](#連携済みユーザ向けエンドポイント)
<div style="page-break-before:always"></div>
### 未連携ユーザ向け**エンドポイント**
未連携のユーザは前工程のリダイレクト後に通常のログインページが表示されます。
通常のログイン処理に加えて、Collabo IDと連携処理を行うための処理を追加実装いただきます。
#### codeとstateクエリパラメーターの保持
リダイレクトからログインページに戻って来る際には以下の例のように`code`と`state`が付与された形となります。
```
https://app1.example.com/login?code=egwijaopgaj&state=faewfawef0awe0
```
この`code`と`state`はユーザのログイン処理完了後のサーバ側の処理にて必要となりますので、以下のような方法でフロントからサーバ側へ送信してください。
- 既存のID・パスワードの通信にこの2つを含む
- HTTPセッションに記憶する
#### Collabo IDと連携状態とする
ユーザのログインID・パスワードの入力が正常に完了し、連携先アプリケーションへのログイン処理が完了したらCollabo IDとの連携処理に入ります。
そのために、以下の処理を実行する必要があります
1. [stateの検証を行う](#stateの検証)
2. APIコールのためのアクセストークンをCollabo IDより取得する
3. 連携APIをコールする
#### アクセストークンの取得
まず、APIコールのためのアクセストークンを取得します
**エンドポイント**
```
https://stg-id.dx-utility.com/oauth/token
```
**メソッド**
POST
**Content-Type**
`application/x-www-form-urlencoded`
**リクエストボディ**
audience、client_id、client_secretはステージング環境・本番環境で変更するため、環境変数等で保持していただくようお願いいたします
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| user_id | アプリ側のユーザーのユニークID(ユーザーの識別子) | 必須 |
|grant_type| authorization_code| 必須 |
| code | 前工程でセッションに保存した`code` | 必須 |
| redirect_uri | ログインページのURI | 必須 |
| audience | [事前にお渡しする情報](#事前にお渡しする情報) AUDIENCE | 必須 |
| client_id | [事前にお渡しする情報](#事前にお渡しする情報)のCLIENT_ID | 必須 |
| client_secret | [事前にお渡しする情報](#事前にお渡しする情報)のCLIENT_SECRET | 必須 |
連携手順
```bash
$ curl -XPOST https://stg-id.dx-utility.com/oauth/token -H 'Content-Type: application/x-www-form-urlencoded' -d 'grant_type=authorization_code&code=74E243GHSerBsiKk2jLDjavSbGgyg1BxiLs8JlTDs0Awg&redirect_uri=https://oauth.pstmn.io/v1/callback&audience=https://id.dx-utility.com/api/v1&client_id=iimRLV7g2oVfWZq2tXhZoH4VaOglbgJm&client_secret=vD3ImOdueyzTCdOZYpxwTgzRlfVZ-b417HvBn-aRMd0MUPtx-iKElb1iZHR3g5uR'
```
これらの実行結果として以下のようなレスポンスが返ります
```json
{
"access_token": "eyJz93a...k4laUWw",
"refresh_token": "GEbRxBN...edjnXbL",
"id_token": "eyJ0XAi...4faeEoQ",
"token_type": "Bearer"
}
```
このレスポンスのうち`access_token`をAPIコールに含みます
<div style="page-break-before:always"></div>
#### 連携APIのコール
前行程で取得したアクセストークンを用いてCollabo IDのAPIをコールします
**エンドポイント**
```
https://stg-id.dx-utility.com/management/api/v1/login/register
```
**メソッド**
POST
**Content-Type**
`application/json`
**リクエストヘッダー**
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| Authorization | Bearer {Collabo IDより取得したアクセストークン} | 必須 |
**リクエストボディ**
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| user_id | アプリ側のユーザーのユニークID(ユーザーの識別子) | 必須 |
連携状態の解除は[連携状態の解除](#連携状態の解除)のAPIにより解除することが可能です。
#### 実行例
```bash
$ curl https://stg-id.dx-utility.com/management/api/v1/login/register -XPOST -H 'Content-Type: application/json' -d '{"userId": "1013"}' -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ii0tbjduWmhtdjl2bkxqeDdRVEdvLSJ9.eyJodHRwczovL2lkLmR4LXV0aWxpdHkuY29tL2N1c3RvbSI6eyJyb2xlIjoicGF0aWVudCIsInVzZXJfaWQiOiJhdXRoMHw2MjMzZjA5OTdkMDJiMjAwNmY0Y2EyMWF8cGF0aWVudCJ9LCJpc3MiOiJodHRwczovL3N0Zy1pZC5keC11dGlsaXR5LmNvbS8iLCJzdWIiOiJhdXRoMHw2MjMzZjA5OTdkMDJiMjAwNmY0Y2EyMWEiLCJhdWQiOlsiaHR0cHM6Ly9pZC5keC11dGlsaXR5LmNvbS9hcGkvdjEiLCJodHRwczovL2R4LXV0aWxpdGllcy1zdGcuanAuYXV0aDAuY29tL3VzZXJpbmZvIl0sImlhdCI6MTY1Mjk0NDc2OSwiZXhwIjoxNjUyOTQ1MDY5LCJhenAiOiJYdGoya2ZTVzJpWWJtWWh1bThkb1VaVGxGZTRqSkFpVSIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MifQ.l1C3ArvPi3YIdIUV3c7-gcFvwGRmMZTIMf5Sg5rwo94HHqIanbBzZ8bJSwo8ZuhL21J73ROETdxVAn-0DEmpMS1FOeNWJBYTNTCVxs38f1WutCq89k3SnfmXAg6BDrYBissQ5yQKr-3rO2lglQDIg6zSgQs3E_6LwQy4LkmQAvLcfB1hiaRhZnHohfigctCNVLs6x0taOLiBzGm3tnIKSJLFrVuEf4aKUlVBFHpBDAPDmmAHvKnogPDcSyMZsmuhptY2IPo5K5Za_A6OuwX9hDYrYEqtvaxla9JazYTwRYwJFBw5sYm-HjHSz047mYGLxywSDDT985AHMtnm_8zdHQ'
```
レスポンス
resultがtrueとしてレスポンスが返った場合、正常に連携処理が成功しています
userIdにはAPIのリクエストボディに格納したuserIdと同じものが格納されます
```json
{
"result": true,
"userId": "1013"
}
```
ここまでの工程でCollabo IDと連携済みの状態となります。
次のログイン時からは連携済みユーザ向けのエンドポイントから自動ログインする動きとなります。
### 連携済みユーザ向け**エンドポイント**
連携済みのエンドポイントに来た場合は通常通りのログイン処理は行わず、パスワードの入力なしに強制的にログイン状態とします。
- どのユーザがログインしようとしているかを判定する処理はCollabo IDのAPIにより行う
- 実際にログインする処理は各連携先アプリケーションで行う
という処理となります。
この実現のために以下の処理を実装していただきます。
1. [stateの検証を行う](#stateの検証)
2. API利用のためのアクセストークンをCollabo IDより取得する
3. Collabo IDのログイン状態取得APIをコールする
4. APIの結果に含まれるユーザIDをログイン状態とする
#### アクセストークンの取得
[アクセストークンの取得(未連携ユーザ向けエンドポイント)](#アクセストークンの取得)と同様の方法でアクセストークンを取得してください。
未連携の場合と異なり`code`をセッションに格納する必要はなく、クエリパラメーターから取得していただければ大丈夫です
#### 連携済みユーザ情報の取得
取得したアクセストークンを含んで、Collabo IDのAPIをコールします
**エンドポイント**
```
https://stg-id.dx-utility.com/management/api/v1/login/authorize
```
**Content-Type**
`application/json`
**リクエストヘッダー**
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| Authorization | Bearer {Collabo IDより取得したアクセストークン} | 必須 |
**リクエストボディ**
不要
#### 実行例
```bash
$ curl https://stg-id.dx-utility.com/management/api/v1/login/authorize -XPOST -H 'Content-Type: application/json' -d '{}' -H 'Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6Ii0tbjduWmhtdjl2bkxqeDdRVEdvLSJ9.eyJodHRwczovL2lkLmR4LXV0aWxpdHkuY29tL2N1c3RvbSI6eyJyb2xlIjoicGF0aWVudCIsInVzZXJfaWQiOiJhdXRoMHw2MjMzZjA5OTdkMDJiMjAwNmY0Y2EyMWF8cGF0aWVudCJ9LCJpc3MiOiJodHRwczovL3N0Zy1pZC5keC11dGlsaXR5LmNvbS8iLCJzdWIiOiJhdXRoMHw2MjMzZjA5OTdkMDJiMjAwNmY0Y2EyMWEiLCJhdWQiOlsiaHR0cHM6Ly9pZC5keC11dGlsaXR5LmNvbS9hcGkvdjEiLCJodHRwczovL2R4LXV0aWxpdGllcy1zdGcuanAuYXV0aDAuY29tL3VzZXJpbmZvIl0sImlhdCI6MTY1Mjk0NDc2OSwiZXhwIjoxNjUyOTQ1MDY5LCJhenAiOiJYdGoya2ZTVzJpWWJtWWh1bThkb1VaVGxGZTRqSkFpVSIsInNjb3BlIjoib3BlbmlkIHByb2ZpbGUgZW1haWwgb2ZmbGluZV9hY2Nlc3MifQ.l1C3ArvPi3YIdIUV3c7-gcFvwGRmMZTIMf5Sg5rwo94HHqIanbBzZ8bJSwo8ZuhL21J73ROETdxVAn-0DEmpMS1FOeNWJBYTNTCVxs38f1WutCq89k3SnfmXAg6BDrYBissQ5yQKr-3rO2lglQDIg6zSgQs3E_6LwQy4LkmQAvLcfB1hiaRhZnHohfigctCNVLs6x0taOLiBzGm3tnIKSJLFrVuEf4aKUlVBFHpBDAPDmmAHvKnogPDcSyMZsmuhptY2IPo5K5Za_A6OuwX9hDYrYEqtvaxla9JazYTwRYwJFBw5sYm-HjHSz047mYGLxywSDDT985AHMtnm_8zdHQ'
```
レスポンス
以下のフォーマットで`userId`が返却されます
```json
{
"applicationId": "${アプリケーションのclient_id}",
"userId": "${アプリケーションに登録したユーザID}"
}
```
### ユーザをログイン状態とする
前工程でユーザIDを取得している状態ですので、このユーザIDに該当するユーザをアプリケーション上でログイン状態としてください。
ログイン状態とする方法は、各プログラミング言語やフレームワークによって異なるため具体的な方法については割愛いたします
以上の処理で、Collabo IDとの連携処理が行えた状態となります。
<div style="page-break-before:always"></div>
## 補足情報
### stateの検証
CSRF対策として、セッションに保存した`state`属性とクエリパラメーターに渡された`state`が一致することを確認してください。
この`state`が一致しない場合、攻撃者に誘導されてログインしている可能性があるため、Collabo IDとの連携処理を行わずにログイン処理を中断してください。
エラー発生時の処理は各アプリケーション側の既存の処理に合わせてください。
- 未ログイン状態としてログインページにリダイレクトする
- エラーページにリダイレクトする
など
### 連携状態の解除
**エンドポイント**
```
https://stg-id.dx-utility.com/management/api/v1/login/unregister
```
**メソッド**
DELETE
**Content-Type**
`application/json`
**リクエストヘッダー**
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| Authorization | Bearer {Collabo IDより取得したアクセストークン} | 必須 |
**リクエストボディ**
なし
<div style="page-break-before:always"></div>
### コラボIDから取得可能なユーザー情報
連携処理に当たっては必須ではありませんが、必要に応じてAPI経由でユーザ情報を取得することが可能です。
(ステージング環境との連携においての例となります)
**エンドポイント**
```
https://stg-id.dx-utility.com/userinfo
```
**メソッド**
GET
**リクエストヘッダー**
| 属性名 | 値 | 必須・任意 |
| --- | --- | --- |
| Authorization | Bearer {Collabo IDより取得したアクセストークン} | 必須 |
**リクエストボディ**
なし
ユーザ情報の例
```json
{
"given_name": "太郎",
"family_name": "山田",
"name": "山田 太郎",
"email": "yamada.tarou@example.com",
"email_verified": true,
"gender": "male",
"birthdate": "2002-02-02",
"iss": "https://stg-id.dx-utility.com/",
"sub": "auth0|618f45efdf74f6006bd6e42d",
"picture": "https://s.gravatar.com/avatar/doctor_example.png",
"https://id.dx-utility.com/custom": {
"role": "doctor",
"user_id": "auth0|618f45efdf74f6006bd6e42d|doctor",
"facility": "285d5d0c-655e-d0eb-4a32-a49780f81bbf"
}
}
```
<div style="page-break-before:always"></div>
| 属性 | 説明 | 必須・任意 | 備考 |
| --- | --- | --- | --- |
| sub | ユーザーID | 必須 | ユーザーを識別する唯一無二のIDです |
| email | メールアドレス | 必須 | ユーザーのメールアドレスです |
| email_verified | 必須 | メール検証済みフラグ | 認証基盤側で検証を強制するため各アプリケーションへ情報が渡る時点では必ずtrueです |
| given_name | 名 | 必須 | 名として入力された情報です |
| family_name | 氏 | 必須 | 氏として入力された情報です |
| name | 氏名 | 必須 | 氏名として入力された情報です |
| gender | 性別 | 任意 | "male", "female", "other", nullのいずれかです|
| birthdate | 生年月日 | 任意 | yyyy-MM-ddの形式です |
| picture | プロフィール画像URL | 任意 | アイコンとして利用する画像のURLです |
| custom.user_id | 職種別ユーザID | 必須 | 同一ユーザを職種別に識別したユーザID |
| custom.role | ログイン中の職種 | 必須 | 複数の職種属性を持つ場合もアプリケーションに渡される属性は1つです |
| custom.facility | ユーザの所属施設 | 任意 | ユーザが所属している施設のIDです。施設の詳細情報が必要な場合はこのidを用いてAPIをコールすることで取得可能です |