laravel5.7 ソーシャルログインエラー
解決済
回答 2
投稿
- 評価
- クリップ 0
- VIEW 1,204
前提・実現したいこと
いまlaravelでソーシャルログインを実装しているのですがエラーが起きてしまいました。
発生している問題・エラーメッセージ
"Argument 1 passed to Illuminate\Auth\SessionGuard::login() must implement interface Illuminate\Contracts\Auth\Authenticatable, instance of Laravel\Socialite\Two\User given, called in /var/www/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 292 ◀"
該当のソースコード
routes/web.php
// for github login
Route::get('github', 'Github\GithubController@top');
Route::post('github/issue', 'Github\GithubController@createIssue');
Route::get('login/github', 'Auth\LoginController@redirectToProvider');
Route::get('login/github/callback', 'Auth\LoginController@handleProviderCallback');
app/http/Controllers/Auth/LoginControllers
<?php
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Socialite;
use Auth;
use App\User;
class LoginController extends Controller
{
use AuthenticatesUsers;
/**
* Where to redirect users after login.
*
* @var string
*/
protected $redirectTo = '/home';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest')->except('logout');
}
/**
* Redirect the user to the GitHub authentication page.
*
* @return \Illuminate\Http\Response
*/
public function redirectToProvider()
{
return Socialite::driver('github')->scopes(['read:user', 'public_repo'])->redirect();
}
/**
* Obtain the user information from GitHub.
*
* @return \Illuminate\Http\Response
*/
public function handleProviderCallback(Request $request)// 追加!
{
$github_user = Socialite::driver('github')->user();
$app_user = User::where(['email' => $github_user->getEmail()])->first();
if(empty($app_user)){
// if the user doesn't have account
$new_user = new User;
$new_user->email = $github_user->getEmail();
$new_user->provider_id = $github_user->getId();
if(!$github_user->name){
$new_user->name = $github_user->getNickname();
}else{
$new_user->name = $github_user->getName();
}
$new_user->save();
Auth::login($new_user);
} else {
// if the user has already an account
Auth::login($github_user);
}
$request->session()->put('github_token', $github_user->token);
return redirect('github');
}
}
app/http/Controllers/Github/GithubController.php
<?php
namespace App\Http\Controllers\Github;
use App\Http\Controllers\Controller;
use Socialite;
use Illuminate\Http\Request;
class GithubController extends Controller
{
public function top(Request $request)
{
$token = $request->session()->get('github_token', null);
try {
$user = Socialite::driver('github')->userFromToken($token);
} catch (\Exception $e) {
return redirect('login/github');
}
return view('/home');
}
public function createIssue(Request $request)
{
$token = $request->session()->get('github_token', null);
$user = Socialite::driver('github')->userFromToken($token);
$client = new \GuzzleHttp\Client();
$res = $client->request('POST', 'https://api.github.com/repos/' . $user->user['login'] . '/' . $request->input('repo') . '/issues', [
'auth' => [$user->user['login'], $token],
'json' => [
'title' => $request->input('title'),
'body' => $request->input('body')
]
]);
return view('done', [
'response' => json_decode($res->getBody())->html_url
]);
}
}
試したこと
検索しましたが方法がわかりませんでした
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
check解決した方法
0
どうやらSocialiteのuser()とデフォルトのAuthenticationのUserモデルは別物であるため
Auth::login()でSocialiteユーザーを扱うことができないようです
そのためloginController内を
- Auth::login($github_user);
+ Auth::login($app_user);
と変更したところ
問題なく作動しました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
0
どうやらSocialiteのuser()とデフォルトのAuthenticationのUserモデルは別物であるため
Auth::login()でSocialiteユーザーを扱うことができないようです
そのためloginController内を
- Auth::login($github_user);
+ Auth::login($app_user);
と変更したところ
問題なく作動しました。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.32%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる