OpenID Connect対応の認証サーバ(OP/IdP)を作るために調べてみた

動機
---

* マイクロサービス化するにあたって、複数サービスに対して横断的な認証／認可の仕組みを作りたい
* ユーザごとに設定された各サービス、各機能ごとの権限設定（認可情報）を一元管理したい
    * 自前でサービスプロバイダを用意する
* 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 プロバイダーの作成](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)では外部にある既存のIdPとつなぎこむことでIAMで管理している情報を引き渡せるようになる仕組みなのでIdPは別途構築が必要
* 公式サイトにも[Amazon Web ServicesはIdPに対応していない("Identity Provider: No")](http://openid.net/developers/uncertified/)って書いてあった

### 各種ライブラリ

#### OP用

* [Certified OpenID Provider Libraries](http://openid.net/developers/certified/#OPLibs)
* [Uncertified OpenID Connect Implementations](http://openid.net/developers/uncertified/)
    * "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](http://openid.net/developers/certified/#RPLibs)
* [Uncertified OpenID Connect Implementations](http://openid.net/developers/uncertified/)
    * "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](http://openid.net/connect/) 公式ページ
    * [OpenID Connect Core 1.0仕様書](http://openid.net/specs/openid-connect-core-1_0.html)
    * [Certified OpenID Connect Implementations](http://openid.net/developers/certified/) 公式認定ライブラリ
        * [Certified Relying Party Libraries](http://openid.net/developers/certified/#RPLibs)がRP用のライブラリ
        * [Certified OpenID Provider Libraries](http://openid.net/developers/certified/#OPLibs)がOP用ライブラリ
    * [非認定ライブラリ](http://openid.net/developers/uncertified/)
        * [Goのdexはリンク切れでしたがこちらにあります](https://github.com/coreos/dex)
* [OpenIDファウンデーション・ジャパン](http://www.openid.or.jp/)
    * [公開資料](http://www.openid.or.jp/document/) 日本語資料、各種発表資料もあり
        * [OpenID Connect Core 1.0仕様書 日本語訳](http://openid-foundation-japan.github.io/openid-connect-core-1_0.ja.html)
* [AWS Documentation - OpenID Connect（OIDC）ID プロバイダーの作成](http://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_create_oidc.html)  
* Web APIをOAuthに対応させよう OAuth 2.0サービスプロバイダの実装  
[『WEB+DB PRESS 2011 vol.63』 p.108](http://gihyo.jp/magazine/wdpress/archive/2011/vol63)  
PHPでのIdP実装方法

---

次回に続く
---

試しにJavaScriptの[panva/node-oidc-provider](https://github.com/panva/node-oidc-provider)で実装してみようと思います。
サンプルコードも結構豊富そうなのが助かる。[panva/node-oidc-provider-example](https://github.com/panva/node-oidc-provider-example)

実装してみました。
[Node.jsでOpenID ConnectのOPとRPを実装してみた](http://qiita.com/moomooya/items/97864e1078a3cc204c17)