【问题标题】:Call to undefined method Laravel\Socialite\Two\User::createToken()调用未定义的方法 Laravel\Socialite\Two\User::createToken()
【发布时间】:2019-07-27 11:25:00
【问题描述】:

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

【问题讨论】:

    标签: php laravel laravel-5.8 laravel-socialite


    【解决方案1】:

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

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

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

    【讨论】:

    • 你的解释迫使我思考,我想出了一个解决方案。
    【解决方案2】:

    首先,我在第一次社交登录后使用护照生成用于用户身份验证的令牌时遇到的所有问题是因为我在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,欢迎发表评论。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-21
      • 2016-05-26
      • 2020-07-07
      • 1970-01-01
      • 2021-04-15
      • 2020-01-18
      • 2018-03-22
      • 2016-11-05
      相关资源
      最近更新 更多