OAuth 2.0って何?

プロ太
プロ太

さて、今日はGoogle認証について学習していきましょう♫
OZくんは「OAuth 2.0」という仕組みを聞いたことある?

OZ
OZ

オーオース…?初めて聞きます。

難しく考えなくて大丈夫。身近な例で説明するね。
OZくんが友達に「代わりに宿題を取りに行って」って頼む場面を想像してみて。

了解です!想像しました!

でも、先生は友達のことを知らないから「あなた誰?」ってなりますよね。そこでOZくんが友達に「私の代わりに宿題を取りに行ってください」という手紙を渡したとします。

あ!分かった!委任状みたいなものですね!

そう!!それが理解できたら、OAuth 2.0も理解できるよ!OAuth 2.0も同じ考え方なんだよ。

  1. あなた(ユーザー)が写真印刷サービスを使いたい
  2. サービスが「Googleフォトから写真を取得していいですか?」と聞く
  3. あなたが「はい、いいですよ」と許可する
  4. Googleが「この人は許可しました」という証明書をサービスに渡す
  5. サービスがその証明書を使って、あなたの写真を取得

なるほど!パスワードを教えるんじゃなくて、「この人は信頼できます」っていう証明書を渡すんですね。

その通り!しかも、この許可はいつでも取り消せるし、「写真だけアクセスOK、でもメールはダメ」みたいに細かく設定できるんだ。

実際の流れを見てみよう

じゃあ、実際にユーザーがGoogle認証を使う時の流れを見てみましょう。OZくんが新しいアプリに登録する場面を想像してください。

はい!

ステップ1: アプリで「Googleアカウントでログイン」ボタンを押してください。

ポチッ!っとな!

ステップ2: すると、Googleのページに飛ばされます。そこで「○○アプリにログインしますか?」って聞かれる

おぉ!よく見る画面ですね!ここで「許可」を押すんですよね?

ステップ3: そう!「許可」を押すと、元のアプリに戻されて…

ログイン完了!

ステップ4: その通り!この時、裏ではGoogleからアプリに「この人の名前はOZで、メールアドレスは○○です」みたいな情報が送られてるんだよ。

へぇ〜!でも、その情報って勝手に送られちゃうんですか?

いい質問だね!ユーザーが「許可」ボタンを押さない限り、何も送られません。しかも、送られる情報も事前に「名前とメールアドレスにアクセスします」って表示されるから、何を共有するかが分かるんだよ。

安心ですね!勝手に全部見られちゃうのかと思いました。

実際のプログラムを見てみよう

今度は、実際にどうやってプログラムを書くのか見てみましょう。Laravelという技術を使った例です。
まず、ユーザーが「Googleでログイン」ボタンを押した時の処理から見ていきましょう。

// Googleの認証画面に送る処理
public function redirectToGoogle()
{
    return Socialite::driver('google')->stateless()->redirect();
}

これだけでGoogleのページに飛ばせるんですか?

そうだよ!「Socialite」っていう便利なツールが全部やってくれるんです。次は、Googleから帰ってきた時の処理を見ていこう!

public function handleGoogleCallback()
{
    // Googleからユーザー情報をもらう
    $googleUser = Socialite::driver('google')->stateless()->user();
    
    // このメールアドレスの人、もう登録済み?
    $existingUser = User::where('email', $googleUser->getEmail())->first();
    
    if ($existingUser) {
        // 既に登録済み → ログインさせる
        Auth::login($existingUser);
    } else {
        // 初めての人 → 新しくアカウントを作る
        $user = User::create([
            'name' => $googleUser->getName(),
            'email' => $googleUser->getEmail(),
            // ... その他の情報
        ]);
        Auth::login($user);
    }
}

なるほど!既に登録している人と初めての人で処理を分けてるんですね。

その通り!既に登録している人はそのままログインして、初めての人は自動で新しいアカウントを作ってからログインさせてるんだよ。

自動でアカウントが作られるなんて、便利ですね!

セキュリティは大丈夫?

でも先生、こんなに便利だと、逆にセキュリティが心配になってきました。悪い人に悪用されたりしないんですか?

実は、Google認証をちゃんと実装するには、いくつか注意が必要なんだよ。

どんなことに注意するんですか?

まず一番重要なのは、HTTPSを使うことだよ

HTTPSって、URLの最初に鍵マークが付くやつですね!

そう!暗号化されていないと、通信の途中で悪い人に認証情報を盗まれる可能性があるんだよ。

怖い…他にはどんな対策があるんですか?

二つ目は、秘密の情報をソースコードに直接書かないことだね。

// ❌ 危険:コードに直接書く
'client_secret' => 'abc123def456',

// ✅ 安全:設定ファイルで管理
'client_secret' => env('GOOGLE_SECRET'),

なるほど!家の鍵を玄関に置きっぱなしにしないのと同じ感じですね。

そして、三つ目は、必要最小限の情報だけもらうことだね。

// ❌ 危険:何でもかんでも取得
$scopes = ['email', 'profile', 'calendar', 'drive', 'photos'];

// ✅ 安全:本当に必要な分だけ
$scopes = ['email', 'profile'];

確かに!必要ない情報までもらわない方が安全ですもんね。

まとめ

というわけで、Google認証は、ユーザーがGoogleアカウントを使って他のサイトにログインできる仕組みです。OAuth 2.0という国際標準を使用していて、ユーザーの許可を得て安全に情報を共有します。Laravelだと、Laravel Socialiteを使って、簡単に実装することができる。既存ユーザーかどうかをメールアドレスで判定し、新規の場合は自動でアカウントを作成する仕組みを使えるということを押させておきましょう♫

はい!ありがとうございました!!