调用未定义的方法 LaravelSocialiteTwoUser::createToken()



在laravel 5.8 API项目中,我希望用户通过他们的社交帐户登录。到目前为止,我已经能够使用 Socialite 从提供商处检索用户信息并使用它来创建新的用户记录。但是当我尝试让用户再次登录时,它会引发以下错误

调用未定义的方法 Laravel\Socialite\Two\User::createToken((

这是我正在使用的代码

<?php
namespace AppHttpControllers;
use AppUser;
use Socialite;
use AppSocialAccount;
use AppHttpResourcesUserResource;
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)]);
        }
    }
}

当用户尝试第二次登录时,我无法发现出现错误的原因,但如果是用户第一次使用社交帐户登录,则没有错误。

为什么它抱怨LaravelSocialiteTwoUser::createToken()方法?如果我尝试添加这一行use LaravelSocialiteTwoUser vscode intelephsense将其标记为AppUser的副本,那么我的代码中到底发生了什么?

我认为你的最后一句话击中了问题:LaravelSocialiteTwoUserAppUser是两个完全独立的实体。

Socialite::driver($provider)->stateless()->user()为您提供Socialite用户,而User::create创建AppUser

第二个$token = $user->createToken('********')->accessToken;有效,因为AppUser具有createToken功能,而另一个没有。

首先,在第一次社交登录后,我遇到了由护照生成的用于用户身份验证的令牌的问题,因为我在Socialite返回的用户上调用了createToken方法。正如@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,欢迎评论。

最新更新