Facebook と同様に、Google は ID を確認するために OAuth2.0 プロトコルを実装しています。OAuth2.0 プロセスがどのように安全であるか、OmniAuth がそれをどのように管理するかを説明し、内部を見て動作を確認する方法を示します。
OmniAuth によって管理される OAuth2.0 プロセス
ID プロバイダーは、ユーザーがログに記録されていることを確認し、ユーザーをコールバック URL にリダイレクトして、ユーザーが ID プロバイダーの認証を使用してサード パーティのサイトにログインできるようにします。
さらに詳しく説明します。ID プロバイダーは、アプリケーションを特定の ID プロバイダー (Facebook、Google など) に登録したときに指定したアプリケーションのコールバック URL にユーザーをリダイレクトします。ユーザーはリダイレクトされたので、認証コードを含むリクエストをアプリケーションに送信します (ログインの成功時に ID プロバイダーから提供されます)。
悪意のあるユーザーがこのコールバックをスプーフィングして、認証ユーザーのサード パーティ アカウントにアクセスできないことをどのように保証しますか?
ここで魔法が起こります。私たちのアプリケーションは、ユーザーからこの認証コードを取得し、それをアプリケーションの登録時に受け取ったシークレット コードと組み合わせて、これらを ID プロバイダーと交換して万能のアクセス コードを取得します。具体的には、このコールバックがスプーフィングされていないことを確認するための手順は次のとおりです。
- プロセス全体が SSL (つまり HTTPS) を介して管理されます。これにより、これらのコードの傍受が非常に困難になります。
- ID プロバイダーは、ログインの成功時に認証コードを提供し、アプリケーションから受け取ったときにこのコードを検証することで、ユーザーの ID を検証します。
- ID プロバイダーは、アプリケーションのシークレット コードを検証することで、アプリケーションの ID を保証します。
したがって、コードを傍受/解読することは非常に困難であり、偽の認証コードでリダイレクトを偽装しようとすると、サーバーが識別プロバイダーでこのコードを検証しようとすると、ログイン要求が拒否されます.
実際に見る
OmniAuth は、このプロセスのほとんどを舞台裏で管理します。ただし、次のコードを使用すると、実際の動作を確認できます。
# Add the following gem to your Gemfile
gem 'httplog', group: :development
httplog gem を使用します。これにより、基本的にリクエスト ログが log/development.log ファイルにダンプされます。初期化する必要があります。
# Create a new file: config/initializers/httplog.rb
HttpLog.options[:logger] = Rails.logger if Rails.env.development?
次に、ターミナルでアプリケーション用の新しい Rails サーバーを起動します。
bundle install
rails s
新しいタブで、開発ログを追跡します。
tail -f log/development.log
ブラウザーを開いて、選択した ID プロバイダーでアプリケーションにログインします。ターミナル ウィンドウを開き、開発ログを追跡します。ユーザーからのコールバック リクエスト ( Started GET "/auth/google_oauth2/callback?state=1
) の後に、次のように表示されます。
[httplog] Connecting: accounts.google.com:443
[httplog] Sending: POST http://accounts.google.com:443/o/oauth2/token
[httplog] Data: client_id=123412341234-1234h1234h1234h1234h.apps.googleusercontent.com&client_secret=12341234123412341234&code=123412341234123412341234&grant_type=authorization_code&redirect_uri=https%3A%2F%2Fyourapp.domain.com%2Fauth%2Fgoogle_oauth2%2Fcallback
....
[httplog] Response:
{
"access_token" : "123412341234123412341234",
"token_type" : "Bearer",
"expires_in" : 3599,
...
}
これは、認証コードを検証し、アクセス トークンを検証するサーバーです。次に、OmniAuth はこのトークンを使用してユーザー情報を取得します。さらに下には、次の項目も表示されます。
[httplog] Connecting: www.googleapis.com:443
[httplog] Sending: GET http://www.googleapis.com:443/plus/v1/people/me/openIdConnect
[httplog] Status: 200
[httplog] Response:
{
"kind": "plus#personOpenIdConnect",
"gender": "male",
"sub": "1234123412341234",
"name": "Matt",
"given_name": "Matt",
...
}
これは、OmniAuth がアクセス トークンを使用して要求した情報をフェッチすることを表します。
長い説明ですが、お役に立てば幸いです。本番環境にプッシュする前に、必ず httplog gem を無効にするか削除してください!