最近我尝试了最新的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,
],
],
]
答案 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();
希望这对某人有所帮助。