laravel Socialiteで設定できるスコープの種類

## 概要

laravelのSocialiteを用いてGoogleの認可サーバーとやり取りする際に指定できるスコープの種類をざっくりとまとめておく

## 前提

説明に用いるコードは下記の内容にて実装済み

https://qiita.com/miriwo/items/cdfad7ed6a44a9d3bae0

## 内容

下記のようなコードを記載することでSocialiteを用いてGoogleのOAuth認証ページにユーザーをリダイレクトさせる事ができる。

```php
Socialite::driver('google')->redirect();
```

このときに`scopes()`を挟むことによりスコープの指定をする事ができる
この`scopes()`には引数に配列形式でスコープを指定する事ができる。
GoogleはOAuth2.0とOpenID Connectを統合して提供しているらしく、OpenId Connectの標準スコープである`email`, `profile`, `openid`を今回の`scopes()`の引数に指定する事もできる。

例↓

```php
Socialite::driver('google')
    ->scopes(['email', 'profile', 'openid']);
    ->redirect();
```

ユーザーのメアド、プロフィール情報、リソースサーバー側プロバイダ内部のユーザー特定に用いる一意のIDを知りたいってだけなら↑くらいのスコープ指定でOK

それとは別に例えば「当該ユーザーのGoogle Cloudのサービス全体のデータ取得に対する権限委譲」などのスコープ設定をしたい場合もある。
その場合は下記に指定されているドキュメント先のURLを`scopes()`に渡してあげればいいらしい。

https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja

例えば

https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#ml

に記載されているスコープである

| スコープURL | 説明 |
| --- | --- |
| https://www.googleapis.com/auth/cloud-platform.read-only | Google Cloud サービス全体のデータの表示、および Google アカウントのメールアドレスの表示 |

を`scopes()`で指定したい場合は下記の様になるらしい。（実際のコードでは専用のconfigファイルを用意して呼び出す形を取りそう）

```php
Socialite::driver('google')
    ->scopes(['https://www.googleapis.com/auth/cloud-platform.read-only']);
    ->redirect();
```

## 実際に試してみる

下記の記事で実装したコードに対して修正を行い、先の「Google Cloudのサービス全体のデータ表示」のスコープを追加設定して認可シーケンスに違いが出るかを確認してみる。

https://qiita.com/miriwo/items/cdfad7ed6a44a9d3bae0

### 既存状態の確認

今回修正するのは`/auth/redirect`にアクセスが来た場合の処理である。

現在web.phpの当該のルーティングは下記のようにコーディングされている。

```routes/web.php
// Googleの認証ページへのリダイレクト
Route::get('/auth/redirect', function () {
    return Socialite::driver('google')
        ->scopes(['email', 'profile'])
        ->redirect();
})->name('google.redirect');
```

これは先に記載した通りOpenID Connect側のスコープを用いて取得データを指定している。
すでに画面側でのログイン動作確認も実施しており、usersテーブルにユーザーデータのレコードが作られてしまっているので一旦削除し、再度`/auth/redirect`にアクセスし、ログインできるところまでの動作を見てみる。

流れは下記

1. Googleの認証画面にリダイレクト
1. ログインするGoogleアカウントを選択
1. ログイン完了

![CleanShot 2025-05-31 at 11.54.09.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/6887669b-1207-401c-9492-8d6149158fad.gif)

次に「Google Cloudのサービス全体のデータ表示」のスコープを追加設定して挙動の変化を見てみる

### 「Google Cloudのサービス全体のデータ表示」のスコープを追加

下記のように修正を行い、既存のOpenID Connectのスコープに加え

https://developers.google.com/identity/protocols/oauth2/scopes?hl=ja#ml

に記載の「Google Cloudのサービス全体のデータ表示」のスコープを追加した。

```routes/web.php
// Googleの認証ページへのリダイレクト
Route::get('/auth/redirect', function () {
    return Socialite::driver('google')
        ->scopes(['email', 'profile', 'https://www.googleapis.com/auth/cloud-platform.read-only'])
        ->redirect();
})->name('google.redirect');
```

今回も直前の動作確認にて、usersテーブルにユーザーデータのレコードが作られてしまっているので一旦削除し、再度`/auth/redirect`にアクセスし、ログインできるところまでの動作を見てみる。

流れは下記

1. Googleの認証画面にリダイレクト
1. ログインするGoogleアカウントを選択
1. テスト状態であることの確認
1. 権限委譲ｎ確認
1. ログイン完了

![CleanShot 2025-05-31 at 11.59.44.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/b688208b-c8bb-4da8-8ba8-a9cba1ec0573.gif)

OpenID Connect以外のスコープを指定したことにより下記の確認シーケンスが加わった

- テスト状態であることの確認
- 権限委譲の確認

このことからも今回のスコープ設定方法そのものん誤りは無いと推測される。
ちなみに今回新たに加わった確認画面の表示は初回ログイン時のみ表示されるので、laravel側サービスにGoogleアカウントを用いてログインするたびに煩わしい確認画面が出ることは無い。最初だけ出る。

「テスト状態であることの確認」の「ディベロッパー」のリンクをクリックした際に表示されるモーダルのメールアドレス（下記スクショ赤枠矢印部分）は[laravel ✕ OAuthを試すためにGoogleでクライアントIDやクライアントシークレットを取得してみる](https://qiita.com/miriwo/items/9485f897045681f820bc#%E6%96%B9%E6%B3%95)の記事の「アプリ名・ユーザーサポートメールをそれぞれ設定し・・・」の部分で設定したものが表示されているっぽい。

![CleanShot 2025-05-31 at 12.08.43.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/31301909-d85d-4c8f-83cf-a603d9642867.jpeg)

## 追記（2025-06-02 その1）

スコープは主に「Socialite側」と「Google Auth Platform側」の2箇所で指定する事ができる。

下記のような棲み分けになっているっぽい。

- Socialite側：ユーザー認証時のアクセストークン払い出し時の権限委譲項目の宣言、及び初回のユーザー同意時の表示のために使用
- Google Auth Platform側：アクセストークンを使用したGoogle APIへのリクエスト送信時のデータ取得範囲を制御するために使用

そのため

```
->scopes(['email', 'profile', 'https://www.googleapis.com/auth/cloud-platform.read-only'])
```

のようにSocialite側ですスコープの設定を行ったら、Google Auth Platform側のスコープにも同様のスコープを指定する必要がある。

最悪スコープが一致していなくても仕組み的に「Socialite側スコープ」<「Google Auth Platform側スコープ」ならエラーになることはなさそうだが、「Socialite側スコープ」>「Google Auth Platform側スコープ」はエラーになる場合がありそう。

なので今回の場合は下記のように関連するGoogle CloudのプロジェクトのGoogle Auth Platformのスコープに`https://www.googleapis.com/auth/cloud-platform.read-only`を追加する必要がある。

![CleanShot 2025-06-02 at 17.24.57.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/306417/a616dd9b-4531-40da-be9c-aaca27e962f8.gif)

## 追記（2025-06-02 その2）

ちなみに、クライアントが複数存在する（同一laravelアプリだが、ユーザー側と管理側のログインがありそれぞれGoogleアカウントを用いる）場合は下記のように設定する。（ユーザー側：Google Cloud上のすべてのファイルの読み込み権限のみ 管理側：Google Cloud上のすべてのファイルの読み込み、更新、削除権限 をそれぞれ与えると過程）

- ユーザー側OAuth認証処理

```web.php
Route::get('/auth/redirect', function () {
    return Socialite::driver('google')
        ->scopes(['email', 'profile', 'https://www.googleapis.com/auth/cloud-platform.read-only'])
        ->redirect();
})->name('google.redirect');
```

- 管理側OAuth認証処理

```admin.php
Route::get('/auth/redirect', function () {
    return Socialite::driver('google')
        ->scopes(['email', 'profile', 'https://www.googleapis.com/auth/cloud-platform'])
        ->redirect();
})->name('google.redirect');
```

Google Auth Platform側のスコープ設定
下記の2スコープを設定（クライアントごとにGoogle Auth Platform側のスコープを指定することはできないらしいが、ユーザー側OAuth認証処理と管理側OAuth認証処理で吐き出されたアクセストークンにすでにスコープ情報が含まれているので問題ないらしい。先に説明した「Socialite側スコープ」<「Google Auth Platform側スコープ」の状態に非常に近い。）

- Google Cloud上のすべてのファイルの読み込み権限のみ（https://www.googleapis.com/auth/cloud-platform.read-only）
- Google Cloud上のすべてのファイルの読み込み、更新、削除権限（https://www.googleapis.com/auth/cloud-platform）