用户在laravel 5.2

时间:2016-07-21 09:25:31

标签: php api eloquent laravel-5.2 restful-authentication

我使用令牌保护来使用post请求中传递的api_token对用户进行身份验证。但我无法使用令牌后卫来检索api_token。我想从retrieveByCredentials($credentials)获取用户并使用validateCredentials($user, $credentials)中的EloquentUserProvider.php检查密码,但要访问它们,我必须使用Auth::guard('api')->provider其中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
            ]
        ]);
    }

注意:我使用过提供商,但我不能使用它,因为它是受保护的财产。

1 个答案:

答案 0 :(得分:0)

在Laravel 5.2中,有2个身份验证后卫' web'如你所知,它们分别在SessionGuard和TokenGuard中实现。

TokenGuard没有用于通过电子邮件和密码检查验证的模块,它只使用api_token检查有效性。 但SessionGuard确实如此; attempt()方法。

所以我们只能使用网络防护来登录,而另一个api,你可以使用' auth:api'其他apis的中间件。

这是登录功能,可以轻松实现。

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' => 20
            ]
        ]);
    }
}