omniauth-openid-connect again

OpenID Connect ストラテジ.

オリジナルはこちら;

最新は 2015年12月にリリースされた v0.2.3. もはやメンテナンスされていない。依存している openid_connect パッケージが古く、困る.

fork し, 多く人による散らばった修正を取り込んだ。

This package replaces 'omniauth-google-oauth2', 'omniauth-yahoojp', and 'omniauth-azure-oauth2'.

Requirements

  • Ruby 2.2 or later
  • omniauth ~> 1.6
  • openid_connect ~> 1.1

Installation

リポジトリをclone してください。

$ git clone https://github.com/hhorikawa/omniauth-openid-connect.git

設定方法

Ruby on Rails 4.2 でテストしています。

設定例はこちら; omniauth-openid-connect 設定例

Ruby
[POPUP]
  1. # -*- coding:utf-8; mode:ruby -*-
  2. # omniauth を使う.
  3. # See https://github.com/omniauth/omniauth
  4. $LOAD_PATH << "/home/hori/repos/hub_omniauth-openid-connect/lib"
  5. require "omniauth-openid-connect"
  6. Rails.application.configure do |config|
  7. config.middleware.use OmniAuth::Builder do
  8. if !Rails.env.production?
  9. provider :openid_connect, {
  10. # /auth/<name> が認証開始のURLになる.
  11. name: :nov_op_sample,
  12. # これがないと, エラー
  13. # 末尾の '/' は付けてはいけない.
  14. # <issuer>/.well-known/openid-configuration
  15. issuer: 'http://localhost:4000',
  16. # 'openid' で OpenID Connect
  17. scope: ["openid","profile","email","address","phone"],
  18. # 'code' is Basic flow. 'token id_token' is Implicit flow.
  19. response_type: :code,
  20. # 有効にしないと, public_key() 内で config.jwks が使われない.
  21. # 必ず true にすること。(デフォルトはfalse)
  22. discovery: true,
  23. # rack-oauth2 パッケージ, Rack::OAuth2::Client.new() に渡される.
  24. # 初期値は, omniauth-openid-connect パッケージ内,
  25. # omniauth/strategies/openid_connect.rb
  26. client_options: {
  27. # omniauth-openid-connect パッケージ内,
  28. # omniauth/strategies/openid_connect.rb:issuer() 内で,
  29. # 上の issuer オプションは使わず, 次の3要素から issuer を作っている.
  30. scheme: "http",
  31. host: "localhost",
  32. port: 4000, # 80番でも省略できない.
  33. # OP側と厳密に合わせる
  34. identifier: クライアントID,
  35. secret: クライアントsecret,
  36. redirect_uri: "http://localhost:8086/auth/nov_op_sample/callback",
  37. },
  38. }
  39. end # !Rails.env.production?
  40. end
  41. end
  42. # See http://qiita.com/nekogeruge_987/items/8bd307f9ae31f27c248a
  43. # http://stackoverflow.com/questions/10963286/callback-denied-with-omniauth
  44. OmniAuth.config.on_failure = Proc.new do |env|
  45. OmniAuth::FailureEndpoint.new(env).redirect_to_failure
  46. end

providerメソッドの第1引数に, :openid_connect を与えます。第2引数のhash で設定を与えます;

:name
[required] omniauth-openid-connect は複数の OpenID Provider に同時に接続できます。ここで区別します。Routing URL は /auth/<name>
:discovery
Boolean. 通常は true にします。<issuer>/.well-known/openid-configuration から設定を自動取得します。

もし false にする場合は, client_options に次を与えてください.

  • :authorization_endpoint
  • :token_endpoint
  • :userinfo_endpoint

さらに, id_token の検証のため, 認証サーバの公開鍵, または公開鍵のハッシュを次のオプションに設定;

  • :client_x509_signing_key
:issuer
[optional] 認証サーバとのやり取りで使われる issuer フィールド値. 指定しない場合は, client_options から自動的に生成されます。ファイルpath部分があるとき, client_options のホストと違うときは, 明示的に指定してください。
:scope
[required] 取得したい内容. プロバイダによってサポートされる値は異なります。scope の一つとして 'openid' を含めてください.

サポートされる値は, <issuer>/.well-known/openid-configuration の scopes_supported.

:response_type
[required] 通常は :code (Authorization Code Flow). ['id_token', 'token'] is the Implicit Flow. ['code', 'token'] is the Hybrid Flow.

ユースケースについては OpenID Connectユースケース、OAuth 2.0の違い・共通点まとめ - Build Insider

client_options は次のように設定します; Hash

:scheme, :host, :port
[required] authorization_endpoint のホストを指定.
:identifier
[required] OpenID Provider が払い出した client_id
:secret
[required] OpenID Provider が払い出した client_secret
:redirect_uri
[required] OpenID Provider に登録した callback URL. 通常は /auth/<name>/callback