LaravelのSociateでscopeで間違えてちょっと詰まった話
メモLaravel

LaravelのSociateでscopeで間違えてちょっと詰まった話

2022.05.23

こんにちはjunです。LaravelでGoogleとのログイン機能、連携機能を作っていた時にscopeメソッドの使い方でちょっと詰まりました。というよりか自分がよくドキュメントを読まなかったケアレスミスでしたが、どこかの開発者が詰まってこの記事を見つけられるようにインターネットの海にこの情報を書いておきます。

Laravelは本当に素晴らしいライブラリで、Laravel socialiteというライブラリを使用すれば外部サービスでのログイン機能があっという間に使用できます 一通りログイン周りの機能を整えて、Google Driveとの連携の実装を行おうとして諸所の設定を行いました。

GCPの管理画面でGoogle Driveを追加してリファランスにしたがって以下のようにログイン時の処理にDriveへのアクセスを求めるようにスコープを追加しました。

public function redirectToGoogle(Request $request){
    return Socialite::driver('google')
    ->with(["access_type" => "offline", "prompt" => "consent select_account"])
    ->setScopes(["https://www.googleapis.com/auth/drive"])
    ->redirect();
}

必要なAPIへのスコープを入力することで、取得できるアクセストークンでそのサービスにアクセスできます。しかし上記の実装でテストをしてみると、連携画面からローカルにリダイレクトする際に401が発生してしまい、連携が失敗しました。

なんでだろうとAPIの設定などをよく確認しましたが、原因はsetScopes()というメソッドでした。

Laravel socialiteはOauthのスコープを設定する際に2つのメソッドをしようできます。scopes(),setScopes()です。メソッドの名前的にsetScopes()を使っていたのですが、これはドキュメントにもある通り

You can overwrite all existing scopes on the authentication request using the setScopes method:

すべての存在するスコープを上書きすると書いてあります。

scopes()はドキュメントでは

This method will merge all previously specified scopes with the scopes that you specify:

と前々にあったスコープにマージすると書かれています。

細かい理由は分かりませんが、多分socialiteが提供する標準のスコープが消されてしまったのが原因かもしれません。とりあえず以下のように修正したら直りました。

public function redirectToGoogle(Request $request){
    return Socialite::driver('google')
    ->with(["access_type" => "offline", "prompt" => "consent select_account"])
    ->scopes(["https://www.googleapis.com/auth/drive"]) // scopesに変更
    ->redirect();
}