SCIMとは
System for Cross-domain Identity Managementの略。
ユーザIdentity情報を、クラウドベースアプリケーションやマイクロサービス間で連携するためのデータフォーマットの仕様。
RFC7642〜7644に定義されており、7643, 7644はStandards Track(標準化過程)にまでなっており、それに従って実装されたサービスがすでに複数存在する。
2015/9にバージョン2.0がリリースされたので、そのフォーマットについて調べてみた。
どんなサービスで使用されているのか?
-
Azure Active Directory
- Active Directoryに設定したユーザ・グループ情報を自動的に他サービスにProvisioningする。
- クライアント側の一例。
-
Trello
- REST API経由でTrelloのユーザ参照・作成等の操作や、チームやボードの参照が可能らしい。
- サーバ側の一例。
その他、SCIM 公式サイトの Implementation
にて紹介されているサイト群を参照。
連携対象となるデータドメイン
下図のように、User情報およびそれらUserをグループ化するようなアクセス制御情報(=Group)がデータ連携対象となる。
Groupの具体的な対象は場合に変わるが、部署であったりアクセス権限のRoleグループであったりする。
また、GroupはメンバーとしてUserまたはGroupを持つ。
EnterpriseUserとは、Userの中でもビジネスに携わったり企業に所属するUserの情報を指し、Userの情報に追加して社員番号や所属部署等の情報が入る。
その他、アプリ固有のデータ項目を追加できるよう、拡張できるようなフォーマットになっている。
※ SCIM 公式サイトより引用
連携方式
公式サイトに記載されている例のように、REST API経由で対象リソース(ユーザやグループ)にアクセスするだけでよい。
以下のようなエンドポイントを用意し、それを経由するイメージ。vにはプロトコルバージョン(例:v2)、resouceには対象となるデータモデル(例:Groups)が入る。
Create: POST https://example.com/{v}/{resource}
Read: GET https://example.com/{v}/{resource}/{id}
Replace: PUT https://example.com/{v}/{resource}/{id}
Delete: DELETE https://example.com/{v}/{resource}/{id}
Update: PATCH https://example.com/{v}/{resource}/{id}
Search: GET https://example.com/{v}/{resource}?filter={attribute}{op}{value}&sortBy={attributeName}&sortOrder={ascending|descending}
Bulk: POST https://example.com/{v}/Bulk
※ Searchだけちょっと実装が面倒そう。
例えばUser作成リクエストだと、以下のようなリクエストが公式サイトでは紹介されている。
POST /v2/Users HTTP/1.1
Accept: application/json
Authorization: Bearer h480djs93hd8
Host: example.com
Content-Length: ...
Content-Type: application/json
{
"schemas":["urn:ietf:params:scim:schemas:core:2.0:User"],
"externalId":"bjensen",
"userName":"bjensen",
"name":{
"familyName":"Jensen",
"givenName":"Barbara"
}
}
そして上記のJsonのデータ項目がRFCにおいて結構しっかり定められている。
追記
Qiitaの記事ないと思って、SCIMについて書いたのだが、以下の記事にすでに似たようなことが書かれていた。。。
https://qiita.com/naka_kyon/items/58e3c55282e997aaef47