動機
- マイクロサービス化するにあたって、複数サービスに対して横断的な認証/認可の仕組みを作りたい
- ユーザごとに設定された各サービス、各機能ごとの権限設定(認可情報)を一元管理したい
- 自前でサービスプロバイダを用意する
- OAuthとかOpenIDとか仕組みは なんとなく わかるけど、実際どうやって作るのか知りたい
概要
- 2017/05時点、OpenID Connectは 1.0
- OAuth2.0の上に構築されている 認証(identity layer) の仕様らしい
- OAuth2.0で認可を請け負い、OpenID Connect1.0で認証を請け負う?
- SAMLはXMLベースでWEBアプリケーション向け、OpenID ConnectはJSONベースでWEBアプリもモバイルアプリも想定している
- OAuthでは認証側をIdP:Identity ProviderというがOpenID ConnectではOP:OpenID Providerと呼ぶ(が、IdP、サービスプロバイダという呼称も一般的なようで混在している場合がある)
実装について
Amazon IAMで作れるかな、と思ったが
- Amazon IAMにあるOpenID Connect(OIDC)ID プロバイダーの作成では外部にある既存のIdPとつなぎこむことでIAMで管理している情報を引き渡せるようになる仕組みなのでIdPは別途構築が必要
- 公式サイトにもAmazon Web ServicesはIdPに対応していない("Identity Provider: No")って書いてあった
各種ライブラリ
OP用
- Certified OpenID Provider Libraries
-
Uncertified OpenID Connect Implementations
- "Identity Provider: YES"のものがOP用
公式公認ライブラリと非公認ライブラリがある。
以下言語で扱いやすいライセンス(MIT/Apache2.0)のライブラリが揃ってる。
- C#
- Java
- JavaScript
- PHP
- Python
- Elixir - Uncertified
- Go - Uncertified
- Haskell - Uncertified
- Perl - Uncertified
Uncertified(非公認)といってもGoだとCoreOS製のライブラリがあったりするので、それだけで過剰に心配する必要はなさそう。
RP用
- Certified Relying Party Libraries
-
Uncertified OpenID Connect Implementations
- "Relying Party: YES"のものがRP用
対応言語は以下の通り。
- C
- C#
- Erlang
- JavaScript
- PHP
- Python
- Ruby
- Go - Uncertified
- Java - Uncertified
- Lua - Uncertified
- Perl - Uncertified
意外にもJavaに公認RPライブラリがない。
動作環境
-
httpsの環境が必要なのでLet's Encryptで用意するか、Herokuなどを使う必要があるので試すのがちょっと面倒-
普通に証明書おいてもいいけど- と思ったけど動作確認には必須じゃなさそうだった
-
参考資料
- Welcome to OpenID Connect 公式ページ
-
OpenIDファウンデーション・ジャパン
- 公開資料 日本語資料、各種発表資料もあり
- AWS Documentation - OpenID Connect(OIDC)ID プロバイダーの作成
- Web APIをOAuthに対応させよう OAuth 2.0サービスプロバイダの実装
『WEB+DB PRESS 2011 vol.63』 p.108
PHPでのIdP実装方法
次回に続く
試しにJavaScriptのpanva/node-oidc-providerで実装してみようと思います。
サンプルコードも結構豊富そうなのが助かる。panva/node-oidc-provider-example
実装してみました。
Node.jsでOpenID ConnectのOPとRPを実装してみた