工藤大嗣
    • Create new note
    • Create a note from template
      • Sharing URL Link copied
      • /edit
      • View mode
        • Edit mode
        • View mode
        • Book mode
        • Slide mode
        Edit mode View mode Book mode Slide mode
      • Customize slides
      • Note Permission
      • Read
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Write
        • Only me
        • Signed-in users
        • Everyone
        Only me Signed-in users Everyone
      • Engagement control Commenting, Suggest edit, Emoji Reply
    • Invite by email
      Invitee

      This note has no invitees

    • Publish Note

      Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

      Your note will be visible on your profile and discoverable by anyone.
      Your note is now live.
      This note is visible on your profile and discoverable online.
      Everyone on the web can find and read all notes of this public team.
      See published notes
      Unpublish note
      Please check the box to agree to the Community Guidelines.
      View profile
    • Commenting
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
      • Everyone
    • Suggest edit
      Permission
      Disabled Forbidden Owners Signed-in users Everyone
    • Enable
    • Permission
      • Forbidden
      • Owners
      • Signed-in users
    • Emoji Reply
    • Enable
    • Versions and GitHub Sync
    • Note settings
    • Note Insights New
    • Engagement control
    • Make a copy
    • Transfer ownership
    • Delete this note
    • Save as template
    • Insert from template
    • Import from
      • Dropbox
      • Google Drive
      • Gist
      • Clipboard
    • Export to
      • Dropbox
      • Google Drive
      • Gist
    • Download
      • Markdown
      • HTML
      • Raw HTML
Menu Note settings Note Insights Versions and GitHub Sync Sharing URL Create Help
Create Create new note Create a note from template
Menu
Options
Engagement control Make a copy Transfer ownership Delete this note
Import from
Dropbox Google Drive Gist Clipboard
Export to
Dropbox Google Drive Gist
Download
Markdown HTML Raw HTML
Back
Sharing URL Link copied
/edit
View mode
  • Edit mode
  • View mode
  • Book mode
  • Slide mode
Edit mode View mode Book mode Slide mode
Customize slides
Note Permission
Read
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Write
Only me
  • Only me
  • Signed-in users
  • Everyone
Only me Signed-in users Everyone
Engagement control Commenting, Suggest edit, Emoji Reply
  • Invite by email
    Invitee

    This note has no invitees

  • Publish Note

    Share your work with the world Congratulations! 🎉 Your note is out in the world Publish Note

    Your note will be visible on your profile and discoverable by anyone.
    Your note is now live.
    This note is visible on your profile and discoverable online.
    Everyone on the web can find and read all notes of this public team.
    See published notes
    Unpublish note
    Please check the box to agree to the Community Guidelines.
    View profile
    Engagement control
    Commenting
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    • Everyone
    Suggest edit
    Permission
    Disabled Forbidden Owners Signed-in users Everyone
    Enable
    Permission
    • Forbidden
    • Owners
    • Signed-in users
    Emoji Reply
    Enable
    Import from Dropbox Google Drive Gist Clipboard
       Owned this note    Owned this note      
    Published Linked with GitHub
    • Any changes
      Be notified of any changes
    • Mention me
      Be notified of mention me
    • Unsubscribe
    ## 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をコールすることで取得可能です |

    Import from clipboard

    Paste your markdown or webpage here...

    Advanced permission required

    Your current role can only read. Ask the system administrator to acquire write and comment permission.

    This team is disabled

    Sorry, this team is disabled. You can't edit this note.

    This note is locked

    Sorry, only owner can edit this note.

    Reach the limit

    Sorry, you've reached the max length this note can be.
    Please reduce the content or divide it to more notes, thank you!

    Import from Gist

    Import from Snippet

    or

    Export to Snippet

    Are you sure?

    Do you really want to delete this note?
    All users will lose their connection.

    Create a note from template

    Create a note from template

    Oops...
    This template has been removed or transferred.
    Upgrade
    All
    • All
    • Team
    No template.

    Create a template

    Upgrade

    Delete template

    Do you really want to delete this template?
    Turn this template into a regular note and keep its content, versions, and comments.

    This page need refresh

    You have an incompatible client version.
    Refresh to update.
    New version available!
    See releases notes here
    Refresh to enjoy new features.
    Your user state has changed.
    Refresh to load new user state.

    Sign in

    Forgot password

    or

    By clicking below, you agree to our terms of service.

    Sign in via Facebook Sign in via Twitter Sign in via GitHub Sign in via Dropbox Sign in with Wallet
    Wallet ( )
    Connect another wallet

    New to HackMD? Sign up

    Help

    • English
    • 中文
    • Français
    • Deutsch
    • 日本語
    • Español
    • Català
    • Ελληνικά
    • Português
    • italiano
    • Türkçe
    • Русский
    • Nederlands
    • hrvatski jezik
    • język polski
    • Українська
    • हिन्दी
    • svenska
    • Esperanto
    • dansk

    Documents

    Help & Tutorial

    How to use Book mode

    Slide Example

    API Docs

    Edit in VSCode

    Install browser extension

    Contacts

    Feedback

    Discord

    Send us email

    Resources

    Releases

    Pricing

    Blog

    Policy

    Terms

    Privacy

    Cheatsheet

    Syntax Example Reference
    # Header Header 基本排版
    - Unordered List
    • Unordered List
    1. Ordered List
    1. Ordered List
    - [ ] Todo List
    • Todo List
    > Blockquote
    Blockquote
    **Bold font** Bold font
    *Italics font* Italics font
    ~~Strikethrough~~ Strikethrough
    19^th^ 19th
    H~2~O H2O
    ++Inserted text++ Inserted text
    ==Marked text== Marked text
    [link text](https:// "title") Link
    ![image alt](https:// "title") Image
    `Code` Code 在筆記中貼入程式碼
    ```javascript
    var i = 0;
    ```
    var i = 0;
    :smile: :smile: Emoji list
    {%youtube youtube_id %} Externals
    $L^aT_eX$ LaTeX
    :::info
    This is a alert area.
    :::

    This is a alert area.

    Versions and GitHub Sync
    Get Full History Access

    • Edit version name
    • Delete

    revision author avatar     named on  

    More Less

    Note content is identical to the latest version.
    Compare
      Choose a version
      No search result
      Version not found
    Sign in to link this note to GitHub
    Learn more
    This note is not linked with GitHub
     

    Feedback

    Submission failed, please try again

    Thanks for your support.

    On a scale of 0-10, how likely is it that you would recommend HackMD to your friends, family or business associates?

    Please give us some advice and help us improve HackMD.

     

    Thanks for your feedback

    Remove version name

    Do you want to remove this version name and description?

    Transfer ownership

    Transfer to
      Warning: is a public team. If you transfer note to this team, everyone on the web can find and read this note.

        Link with GitHub

        Please authorize HackMD on GitHub
        • Please sign in to GitHub and install the HackMD app on your GitHub repo.
        • HackMD links with GitHub through a GitHub App. You can choose which repo to install our App.
        Learn more  Sign in to GitHub

        Push the note to GitHub Push to GitHub Pull a file from GitHub

          Authorize again
         

        Choose which file to push to

        Select repo
        Refresh Authorize more repos
        Select branch
        Select file
        Select branch
        Choose version(s) to push
        • Save a new version and push
        • Choose from existing versions
        Include title and tags
        Available push count

        Pull from GitHub

         
        File from GitHub
        File from HackMD

        GitHub Link Settings

        File linked

        Linked by
        File path
        Last synced branch
        Available push count

        Danger Zone

        Unlink
        You will no longer receive notification when GitHub file changes after unlink.

        Syncing

        Push failed

        Push successfully