[{"data":1,"prerenderedAt":182},["ShallowReactive",2],{"article-laravel-socialite-scope-careless":3},{"id":4,"title":5,"body":6,"category":168,"createdAt":170,"description":5,"extension":171,"index":172,"meta":173,"navigation":174,"path":175,"publish":174,"seo":176,"series":172,"seriesTitle":172,"stem":177,"tag":178,"thumbnail":180,"updatedAt":172,"__hash__":181},"articles\u002Farticles\u002Flaravel-socialite-scope-careless.md","LaravelのSociateでscopeで間違えてちょっと詰まった話",{"type":7,"value":8,"toc":166},"minimark",[9,13,16,19,67,70,77,98,109,116,121,126,129,132,162],[10,11,12],"p",{},"こんにちはjunです。LaravelでGoogleとのログイン機能、連携機能を作っていた時にscopeメソッドの使い方でちょっと詰まりました。というよりか自分がよくドキュメントを読まなかったケアレスミスでしたが、どこかの開発者が詰まってこの記事を見つけられるようにインターネットの海にこの情報を書いておきます。",[10,14,15],{},"Laravelは本当に素晴らしいライブラリで、Laravel socialiteというライブラリを使用すれば外部サービスでのログイン機能があっという間に使用できます\n一通りログイン周りの機能を整えて、Google Driveとの連携の実装を行おうとして諸所の設定を行いました。",[10,17,18],{},"GCPの管理画面でGoogle Driveを追加してリファランスにしたがって以下のようにログイン時の処理にDriveへのアクセスを求めるようにスコープを追加しました。",[20,21,26],"pre",{"className":22,"code":23,"language":24,"meta":25,"style":25},"language-php shiki shiki-themes material-theme-ocean","public function redirectToGoogle(Request $request){\n    return Socialite::driver('google')\n    ->with([\"access_type\" => \"offline\", \"prompt\" => \"consent select_account\"])\n    ->setScopes([\"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive\"])\n    ->redirect();\n}\n","php","",[27,28,29,37,43,49,55,61],"code",{"__ignoreMap":25},[30,31,34],"span",{"class":32,"line":33},"line",1,[30,35,36],{},"public function redirectToGoogle(Request $request){\n",[30,38,40],{"class":32,"line":39},2,[30,41,42],{},"    return Socialite::driver('google')\n",[30,44,46],{"class":32,"line":45},3,[30,47,48],{},"    ->with([\"access_type\" => \"offline\", \"prompt\" => \"consent select_account\"])\n",[30,50,52],{"class":32,"line":51},4,[30,53,54],{},"    ->setScopes([\"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive\"])\n",[30,56,58],{"class":32,"line":57},5,[30,59,60],{},"    ->redirect();\n",[30,62,64],{"class":32,"line":63},6,[30,65,66],{},"}\n",[10,68,69],{},"必要なAPIへのスコープを入力することで、取得できるアクセストークンでそのサービスにアクセスできます。しかし上記の実装でテストをしてみると、連携画面からローカルにリダイレクトする際に401が発生してしまい、連携が失敗しました。",[10,71,72,73,76],{},"なんでだろうとAPIの設定などをよく確認しましたが、原因は",[27,74,75],{},"setScopes()","というメソッドでした。",[10,78,79,80,83,84,86,87,89,90,97],{},"Laravel socialiteはOauthのスコープを設定する際に２つのメソッドをしようできます。",[27,81,82],{},"scopes()",",",[27,85,75],{},"です。メソッドの名前的に",[27,88,75],{},"を使っていたのですが、これは",[91,92,96],"a",{"href":93,"rel":94},"https:\u002F\u002Flaravel.com\u002Fdocs\u002F9.x\u002Fsocialite#access-scopes",[95],"nofollow","ドキュメントにもある通り"," に",[99,100,101],"blockquote",{},[10,102,103,104,108],{},"You can ",[105,106,107],"strong",{},"overwrite all existing scopes"," on the authentication request using the setScopes method:",[10,110,111,112,115],{},"と",[105,113,114],{},"すべての存在するスコープを上書きする","と書いてあります。",[10,117,118,120],{},[27,119,82],{},"はドキュメントでは",[99,122,123],{},[10,124,125],{},"This method will merge all previously specified scopes with the scopes that you specify:",[10,127,128],{},"と前々にあったスコープにマージすると書かれています。",[10,130,131],{},"細かい理由は分かりませんが、多分socialiteが提供する標準のスコープが消されてしまったのが原因かもしれません。とりあえず以下のように修正したら直りました。",[20,133,135],{"className":22,"code":134,"language":24,"meta":25,"style":25},"public function redirectToGoogle(Request $request){\n    return Socialite::driver('google')\n    ->with([\"access_type\" => \"offline\", \"prompt\" => \"consent select_account\"])\n    ->scopes([\"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive\"]) \u002F\u002F scopesに変更\n    ->redirect();\n}\n",[27,136,137,141,145,149,154,158],{"__ignoreMap":25},[30,138,139],{"class":32,"line":33},[30,140,36],{},[30,142,143],{"class":32,"line":39},[30,144,42],{},[30,146,147],{"class":32,"line":45},[30,148,48],{},[30,150,151],{"class":32,"line":51},[30,152,153],{},"    ->scopes([\"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive\"]) \u002F\u002F scopesに変更\n",[30,155,156],{"class":32,"line":57},[30,157,60],{},[30,159,160],{"class":32,"line":63},[30,161,66],{},[163,164,165],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}",{"title":25,"searchDepth":45,"depth":45,"links":167},[],[169],"ministack","2022-05-23","md",null,{},true,"\u002Farticles\u002Flaravel-socialite-scope-careless",{"title":5,"description":5},"articles\u002Flaravel-socialite-scope-careless",[179],"laravel","_common\u002Flaravel.png","tdenFwXM57aAqHk4siNzWCo8FXhh1YpEFCNAWNUhrnw",1780987143015]