我使用令牌保护来使用post请求中传递的api_token对用户进行身份验证。但我无法使用代币守卫取回api_token。我曾想过从retrieveByCredentials($credentials)
获取用户,并使用EloquentUserProvider.php
中的validateCredentials($user, $credentials)
检查密码,但要访问它们,我必须使用Auth::guard('api')->provider
,其中提供者是受保护的属性。所以我必须手动操作。在实现登录时,有没有简单的过程可以获得api_token。
我在AuthController.php 中的登录方法
public function api_login(Request $request)
{
$validator = Validator::make($request->all(), ['email' => 'required', 'password' => 'required']);
$credentials = $this->getCredentials($request);
$user = Auth::guard('api')->provider->retrieveByCredentials($credentials);
if(is_null($user)) {
return response()->json([
'error' => [
'message' => 'Your email is not registered yet',
'status_code' => 40
]
]);
} elseif(Auth::guard('api')->provider->validateCredentials($user, $credentials)) {
return response()->json([
'success' => [
'api_token' => Auth::guard('api')->user()->api_token,
'message' => 'Login successful',
'status_code' => 200
]
]);
}
return response()->json([
'error' => [
'message' => 'Login failed',
'status_code' => 20
]
]);
}
注意:我使用了provider,但我不能使用它,因为它是受保护的属性。
在Laravel 5.2中,有两个身份验证保护'web'
和'api'
,它们分别在SessionGuard
和TokenGuard
中实现,正如您所知。
TokenGuard
没有使用电子邮件和密码检查验证的模块,它只使用api_token
检查有效性。但SessionGuard
确实如此;CCD_ 12方法。
因此,我们只能使用webguard进行登录,其他api可以使用'auth:api'
中间件。
这里是登录功能,可以很容易地实现。
public function api_login(Request $request)
{
$validator = Validator::make($request->all(), ['email' => 'required', 'password' => 'required']);
$credentials = $this->getCredentials($request);
// only web guard can validate with credentials
$guard = Auth::guard('web');
if ($guard->attempt($credentials)) {
// maybe you can generate api_token again here
return response()->json([
'success' => [
'api_token' => $guard->user()->api_token,
'message' => 'Login successful',
'status_code' => 200
]
]);
}
else {
return response()->json([
'error' => [
'message' => 'Login failed',
'status_code' => 200
]
]);
}
}