Google Identity Platform
google に接続する方法.
issuer
は "https://accounts.google.com"
.
discovery: true
の場合
client secret は, 環境変数で与えるのが基本。
Ruby
- Rails.application.configure do |config|
-
- config.middleware.use OmniAuth::Builder do
-
- provider :openid_connect, {
- name: :google_oauth2,
-
- issuer: 'https://accounts.google.com',
-
-
-
- scope: [:openid, :email, :profile],
-
-
- response_type: :code,
-
- discovery: true,
-
- client_options: {
- scheme: "https",
- host: "accounts.google.com",
- port: 443,
-
-
-
- identifier: ENV['GOOGLE_CLIENT_ID'],
- secret: ENV['GOOGLE_CLIENT_SECRET'],
- redirect_uri: ENV['GOOGLE_REDIRECT_URI'],
- },
- }
discovery: false
の場合
authorization_endpoint
などを指定してやる必要がある。内容は, <issuer>/.well-known/openid-configuration
で得られるものと同じ。
それから, id_token を検証するために, 認証サーバの公開鍵をロードしておく必要がある。クライアントの鍵ではない。
Ruby
- provider :openid_connect, {
- name: :google_oauth2,
-
- issuer: 'https://accounts.google.com',
-
- scope: [:openid, :email, :profile],
-
- response_type: :code,
-
- discovery: false,
-
- client_options: {
- scheme: "https",
- host: "accounts.google.com",
- port: 443,
-
-
-
- identifier: ENV['GOOGLE_CLIENT_ID'],
- secret: ENV['GOOGLE_CLIENT_SECRET'],
- redirect_uri: ENV['GOOGLE_REDIRECT_URI'],
-
-
- authorization_endpoint: '/o/oauth2/v2/auth',
- token_endpoint: 'https://oauth2.googleapis.com/token',
- userinfo_endpoint: 'https://openidconnect.googleapis.com/v1/userinfo',
- },
-
-
- client_x509_signing_key: JSON.load(File.read(Rails.root.to_s + '/certs'))
- }
certsファイルは, 形式がいくつかある。
PEM ファイルや, 複数の PEM を JSON で束ねたもの (以下に示す.) の場合は, client_x509_signing_key
オプションに与える。
どの公開鍵が使われるかは分からないので、全部読み込んでおくこと。
JavaScript
- {
- "960a7e8e8341ed752f12b186fa129731fe0b04c0": "-----BEGIN CERTIFICATE-----\nMIIDJjCCAg6gAwIBAgIICKXnIDCzjxQwDQYJKoZIhvcNAQEFBQAwNjE0MDIGA1UE\nAxMrZmVkZXJhdGVkLXNp
- ...
JSON Web Key (JWK) フォーマットまたは JWK Set フォーマットの場合は, client_jwk_signing_key
オプションに与える.
JavaScript
- {
- "keys": [
- {
- "n": "xHKHysGHfZby92stAyC4Xkp7t2Ib6TEha1G11UwGgmrv7pgpjKBJkO1XtvvT2L3pEylhcKhLgO8fx5R-rKceezZ_YpTyuT1vHHsWYJxeocV5m0V70_Nvgfysl6lS_gdvfT68dMNk1EL8bIk9uiCMIotVpcq4FIeID75Dendq_oTuXOZVeCi1r8q0qeMWN7nFZEJCnxzayNOTE7-eC8FRMRiu-e3tOtkruga3Cz62nkkrGtQyAaQtUntrDTQxjE2TNhBvWBWDVOfvG-uCe2JkhfDC7CZlE6tpBo-VkyIGGZjR5qBlYTKx6ZJjWeQC13lpwd7WB1vKtBSKGH2vKuBbrQ",
- "kty": "RSA",
- "kid": "c1771814ba6a70693fb9412da3c6e90c2bf5b927",
- "e": "AQAB",
- "alg": "RS256",
- "use": "sig"
- },
- { ...
RSA 暗号の公開鍵を構成する, modulus n (法) と encryption or public exponent e (公開指数) が含まれる。
Yahoo! ID連携 v2
Yahoo! JAPAN.
discovery
オプションは必ず true
.
issuer
は "https://auth.login.yahoo.co.jp/yconnect/v2"
. ファイルpath部分がある.
Ruby
- provider :openid_connect, {
- name: :yahoojapan,
-
- issuer: 'https://auth.login.yahoo.co.jp/yconnect/v2',
-
- scope: [:openid, :email, :profile, :address],
-
- response_type: :code,
-
- discovery: true,
-
- client_options: {
- scheme: "https",
- host: "auth.login.yahoo.co.jp",
- port: 443,
-
- identifier: ENV['YAHOOJP_CLIENT_ID'],
- secret: ENV['YAHOOJP_CLIENT_SECRET'],
- redirect_uri: ENV['YAHOOJP_REDIRECT_URI'],
- },
- }
Microsoft Azure Active Directory v2
Azure AD v2は、ほかの IdP と挙動が近くなった。end_session_endpoint
をサポートしており、Single Logout (SLO) が可能.
issuer
は "https://login.microsoftonline.com/{tenantid}/v2.0"
の形. {tenantid}
部分にテナントIDが入る。
send_client_secret_to_token_endpoint
オプションを true
にすること。omniauth-openid-connect 内で workaround が動く. 指定しなくても動くようにしました。
discovery
オプションは必ず true
.
Ruby
- provider :openid_connect, {
- name: :azure_ad,
-
- issuer: ENV['AZURE_ISSUER'],
-
- scope: [:openid],
-
-
-
-
-
-
- response_type: ['code'],
-
-
- send_client_secret_to_token_endpoint: true,
-
- discovery: true,
-
- client_options: {
- scheme: "https",
- host: "login.windows.net",
- port: 443,
-
- identifier: ENV['AZURE_CLIENT_ID'],
- secret: ENV['AZURE_CLIENT_SECRET'],
- redirect_uri: ENV['AZURE_REDIRECT_URI'],
- },
- }
nov/openid_connect_sample
Ruby
-
-
-
-
-
- Rails.application.configure do |config|
- config.middleware.use OmniAuth::Builder do
- if !Rails.env.production?
- provider :developer
-
- provider :openid_connect, {
-
- name: :nov_op_sample,
-
-
-
-
- issuer: 'http://localhost:4000',
-
-
- scope: ["openid","profile","email","address","phone"],
-
-
- response_type: :code,
-
-
-
- discovery: true,
-
-
-
-
- client_options: {
-
-
-
- scheme: "http",
- host: "localhost",
- port: 4000,
-
-
- identifier: クライアントID,
- secret: クライアントsecret,
- redirect_uri: "http://localhost:3000/auth/nov_op_sample/callback",
- },
- }
- end
-
- end
- end
-
-
-
- OmniAuth.config.on_failure = Proc.new do |env|
- OmniAuth::FailureEndpoint.new(env).redirect_to_failure
- end