在laravel 5.8 API项目中,我希望用户通过其社交帐户登录。到目前为止,我已经能够使用Socialite从提供程序中检索用户信息,并使用它来创建新的用户记录。但是当我尝试让用户再次登录时,它会引发以下错误
调用未定义的方法Laravel \ Socialite \ Two \ User :: createToken()
这是我正在使用的代码
<?php
namespace App\Http\Controllers;
use App\User;
use Socialite;
use App\SocialAccount;
use App\Http\Resources\UserResource;
class SocialAuthController extends Controller
{
...
public function handleProviderCallback($provider)
{
$socialUser = Socialite::driver($provider)->stateless()->user();
$userSocialAccount = SocialAccount::where('provider_id', $socialUser->id)->where('provider_name', $provider)->first();
/*
if account exist, return the social account user
else create the user account, then return the new user
*/
if ($userSocialAccount) {
// generate access token for use
$token = $socialUser->createToken('********')->accessToken;
// return access token & user data
return response()->json([
'token' => $token,
'user' => (new UserResource($userSocialAccount))
]);
} else {
$user = User::create([
'firstname' => $socialUser->name,
'lastname' => $socialUser->name,
'username' => $socialUser->email,
'email_verified_at' => now()
]);
if ($user) {
SocialAccount::create([
'provider_id' => $socialUser->id,
'provider_name' => $provider,
'user_id' => $user->id
]);
}
// assign passport token to user
$token = $user->createToken('********')->accessToken;
return response()->json(['token' => $token, 'user' => new UserResource($user)]);
}
}
}
当用户尝试第二次登录时,我无法发现出现错误的原因,但是如果这是用户首次使用社交帐户登录,则不会出现错误。
为什么会抱怨Laravel\Socialite\Two\User::createToken()
方法?如果我尝试添加此行use Laravel\Socialite\Two\User
vscode intelephsense将其标记为App\User
的副本,那么我的代码中到底发生了什么?
答案 0 :(得分:1)
我认为您的最后一句话引起了问题:Laravel\Socialite\Two\User
和App\User
是两个完全独立的实体。
Socialite::driver($provider)->stateless()->user()
为您提供了一个Socialite
用户,而User::create
创建了一个App\User
。
第二个$token = $user->createToken('********')->accessToken;
之所以起作用是因为App\User
具有createToken
功能,而另一个没有。
答案 1 :(得分:1)
首先,我在第一次社交登录后由护照生成的令牌用于用户身份验证时遇到的问题是因为我正在对createToken
返回的用户调用Socialite
方法。正如@ JorisJ1所解释的,Socialite
没有createToken
函数,因此我的初始代码引发了错误。
这是我修复的方式
public function handleProviderCallback($provider)
{
// retrieve social user info
$socialUser = Socialite::driver($provider)->stateless()->user();
// check if social user provider record is stored
$userSocialAccount = SocialAccount::where('provider_id', $socialUser->id)->where('provider_name', $provider)->first();
if ($userSocialAccount) {
// retrieve the user from users store
$user = User::find($userSocialAccount->user_id);
// assign access token to user
$token = $user->createToken('Pramopro')->accessToken;
// return access token & user data
return response()->json([
'token' => $token,
'user' => (new UserResource($user))
]);
} else {
...
}
}
如果有更好的方法向API添加社交身份验证,欢迎发表评论。