omniauth-openid-connect 設定例

Google Identity Platform

google に接続する方法.

Ruby
[POPUP]
  1. Rails.application.configure do |config|
  2. config.middleware.use OmniAuth::Builder do
  3. # google: OpenID Connect
  4. provider :openid_connect, {
  5. name: :google_oauth2,
  6. issuer: 'https://accounts.google.com',
  7. # 'openid' で OpenID Connect
  8. # サポート範囲は <issuer>/.well-known/openid-configuration
  9. scope: [:openid, :email, :profile],
  10. # 'code' is Basic flow. 'token id_token' is Implicit flow.
  11. response_type: :code,
  12. discovery: true,
  13. client_options: {
  14. scheme: "https",
  15. host: "accounts.google.com",
  16. port: 443, # 省略不可.
  17. # Google API Console での指定と厳密に一致していること.
  18. # https://console.cloud.google.com/apis/credentials
  19. identifier: ENV['GOOGLE_CLIENT_ID'],
  20. secret: ENV['GOOGLE_CLIENT_SECRET'],
  21. redirect_uri: ENV['GOOGLE_REDIRECT_URI'],
  22. },
  23. }

discovery: falseの場合。この場合は、id_token を検証するために, 認証サーバの公開鍵をロードしておく必要がある。

Ruby
[POPUP]
  1. provider :openid_connect, {
  2. name: :google_oauth2,
  3. issuer: 'https://accounts.google.com',
  4. scope: [:openid, :email, :profile],
  5. response_type: :code,
  6. discovery: false,
  7. client_options: {
  8. scheme: "https",
  9. host: "accounts.google.com",
  10. port: 443, # 省略不可.
  11. # Google API Console での指定と厳密に一致していること.
  12. # https://console.cloud.google.com/apis/credentials
  13. identifier: ENV['GOOGLE_CLIENT_ID'],
  14. secret: ENV['GOOGLE_CLIENT_SECRET'],
  15. redirect_uri: ENV['GOOGLE_REDIRECT_URI'],
  16. # discovery: falseの時に指定.
  17. authorization_endpoint: '/o/oauth2/v2/auth',
  18. token_endpoint: 'https://www.googleapis.com/oauth2/v4/token',
  19. userinfo_endpoint: 'https://www.googleapis.com/oauth2/v3/userinfo',
  20. },
  21. #client_signing_alg: 'RS256',
  22. client_x509_signing_key: JSON.load(File.read(Rails.root.to_s + '/certs'))
  23. }

certsファイルは, <https://www.googleapis.com/oauth2/v1/certs> の内容. どの鍵が使われるかは分からないので、全部読み込んでおくこと。

{ "e6ba29695565f78479901cf359fd6e9bdbbd7ccd": "-----BEGIN CERTIFICATE-----\nMIIDJjCCAg6gAwIBAgIIEz2cBgTizOgwDQYJKoZIhvcNAQEFBQAwNjE0MDIGA1UE\nAxMrZmVkZXJhdGVkLXN

Yahoo! ID連携 v2

Yahoo! JAPAN. issuer にファイルpath部分がある.

Ruby
[POPUP]
  1. provider :openid_connect, {
  2. name: :yahoojapan,
  3. issuer: 'https://auth.login.yahoo.co.jp/yconnect/v2',
  4. scope: [:openid, :email, :profile, :address],
  5. response_type: :code,
  6. discovery: true,
  7. client_options: {
  8. scheme: "https",
  9. host: "auth.login.yahoo.co.jp",
  10. port: 443, # 省略不可.
  11. identifier: ENV['YAHOOJP_CLIENT_ID'],
  12. secret: ENV['YAHOOJP_CLIENT_SECRET'],
  13. redirect_uri: ENV['YAHOOJP_REDIRECT_URI'],
  14. },
  15. }

Microsoft Azure Active Directory

Azure AD. issuer がクライアントごとに払い出される?

issuer は "https://sts.windows.net/xxxx-yyyy-zzzz-xxxx/" の形式. client_options.host と違う.

send_client_secret_to_token_endpoint オプションを true にすること。omniauth-openid-connect 内で workaround が動く.

Ruby
[POPUP]
  1. provider :openid_connect, {
  2. name: :azure_ad,
  3. issuer: ENV['AZURE_ISSUER'],
  4. scope: [:openid],
  5. # ドキュメントでは, Azure ADは, 'id_token' を含めなければならないことになっている;
  6. # https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-protocols-openid-connect-code
  7. # 実際には, ['code', 'id_token'] はレスポンスが不正. フラグメントになる.
  8. # ['code', 'id_token', 'token'] では unsupported_response_type
  9. # => 結局, 'code' のみでよい.
  10. response_type: ['code'],
  11. # Azure ADのみ.
  12. send_client_secret_to_token_endpoint: true,
  13. discovery: true,
  14. client_options: {
  15. scheme: "https",
  16. host: "login.windows.net", # issuer のホストと違う!
  17. port: 443, # 省略不可.
  18. identifier: ENV['AZURE_CLIENT_ID'],
  19. secret: ENV['AZURE_CLIENT_SECRET'],
  20. redirect_uri: ENV['AZURE_REDIRECT_URI'],
  21. },
  22. }