繁体   English   中英

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

[英]Call to undefined method Laravel\Socialite\Two\User::createToken()

在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的副本,那么我的代码中到底发生了什么?

我认为您的最后一句话碰到了问题: Laravel\\Socialite\\Two\\UserApp\\User是两个完全独立的实体。

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

第二个$token = $user->createToken('********')->accessToken; 之所以有效,是因为App\\User具有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添加社交身份验证,欢迎发表评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM