Auth :: attempt()在Laravel 6.4中出现错误提示“调用未定义的方法Illuminate \ Auth \ TokenGuard :: attempt()”

时间:2019-10-30 16:40:48

标签: php laravel

最近我尝试了最新的Laravel(6.4)。试图实现基于API的简单登录功能。没有使用Passport或Tymon的JWT之类的软件包。我使用了非常基本的身份验证(只是在用户表中保留一列,命名为“ api_token”)。但是出现en错误,说

  

Symfony \ Component \ Debug \ Exception \ FatalThrowableError:调用未定义的方法Illuminate \ Auth \ TokenGuard :: attempt()

这是我的控制人

//only method in the controller, so used `__invoke` method.
    public function __invoke(Request $request)
    {
         $request->validate([
              'email'    => 'required',
              'password' => 'required',
         ]);

         $credentials = $request->only(['email', 'password']);
         $credentials['active'] = 1;

         if (Auth::guard('api')->attempt($credentials)) {
              return response()->json([
                  'data' => 'Wrong credential given'
              ]);
         }

         return response()->json([
             'data' => \auth()->user()
         ]);
    }

这是我的config/auth.php文件状态。我正在使用api Guard访问。但是令牌应该在登录后出现。在这里,我无法登录。

    'defaults' => [
            'guard' => 'api',
            'passwords' => 'users',
        ],

        'guards' => [
            'web' => [
                'driver' => 'session',
                'provider' => 'users',
            ],

            'api' => [
                'driver' => 'token',
                'provider' => 'users',
                'hash' => false,
            ],
        ],
    ]

3 个答案:

答案 0 :(得分:2)

API Guard没有attempt方法,也没有任何其他形式的用户登录。它所做的只是保护路线。要对用户进行身份验证,您仍应使用默认防护。

答案 1 :(得分:1)

当我将默认防护设置到'web'时(先前),问题得以解决。正如亚历克(Alec)在回答中所说的The API Guard does not have an attempt method。我以为api需要在那里进行API调用。但是,当您要授权用户时,它是必需的。但在此之前,您可以使用默认的web防护来处理登录和注册。

所以,这是我的最终更改。 控制器:

   $request->validate([
        'email'    => 'required',
        'password' => 'required',
    ]);

    $credentials = $request->only(['email', 'password']);
    $credentials['active'] = 1;

    if (Auth::attempt($credentials)) {
        return response()->json([
            'data' => auth()->user()
        ]);
    }

    return response()->json([
        'data' => 'Wrong credential given'
    ]);

这是我的config / auth.php文件

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'token',
        'provider' => 'users',
        'hash' => false,
    ],
],

答案 2 :(得分:1)

对我有用的是将 config/auth 文件中的守卫驱动程序从令牌更改为会话

'guards' => [
    'staff' => [
        'driver' => 'session',
        'provider' => 'my_provider',
        'hash' => false,
    ]
]

有了这个尝试就像魔术一样工作。现在我可以像这样使用这个中间件验证用户

Auth::guard('staff')->attempt([
    'email' => $r->email, 
    'password' => $r->password
]);

像这样访问登录用户的信息

auth('staff')->user();

希望这对某人有所帮助。