无法登录API

时间:2019-10-01 16:57:52

标签: php laravel api laravel-6

我正在尝试从头开始构建API身份验证,但无法登录用户。 我认为问题出在令牌驱动程序上,但不确定。

经过更多搜索后,我发现Laravel API docs.看起来像是我使用Auth::guard('api')->setUser();的laravel源代码中的每个函数,这使check函数返回true,但是仍然认为出了点问题由于闲置12小时后,检查功能仍返回true

Auth::guard('web')->login($user); // this line works perfectly
Auth::guard('api')->login($user); 
// this line return an error undefined function login

这是我的注册控制器代码

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;

use Illuminate\Support\Facades\Auth;
use Hash;
use Validator;
use Illuminate\Support\Str;

use App\User;

class RegisterController extends Controller
{
    public function register(Request $req)
    {
      $this->validator($req->all())->validate();
      $data = $this->extractData($req);
      $user = $this->create($data);
      $token = $user->addAPIToken();
      $this->guard()->setUser($user);
      echo $this->guard()->check();
      return response()->json(['token' => $token]);

    }

    protected function validator(array $data)
    {
      return Validator::make($data, [
        'name' => 'required|string|min:3',
        'email' => 'required|email|unique:users',
        'password' => 'required|min:12|string|confirmed'
      ]);
    }

    protected function extractData(Request $req){
      return [
        'name' => $req->name,
        'email' => $req->email,
        'password' => Hash::make($req->password)
      ];
    }

    protected function create(array $data){
      return User::create($data);
    }

    protected function addToken(User $user){
      $token = Str::random(60);
      $user->update(['api_token' => hash('sha256', $token)]);
      return $token;
    }

    protected function guard(){
      return Auth::guard('api');
    }

}

这就是我创建令牌的方式

public function addAPIToken()
    {
      do {
        $token = Str::random(60);
        $this->api_token = hash('sha256', $token);
      } while ($this->where('api_token', $this->api_token)->exists());
      $this->save();
      return $token;
    }

1 个答案:

答案 0 :(得分:1)

API通常使用令牌来验证用户身份,并且不维护请求之间的会话状态。在您的“ config / auth.php”中,您可以看到以下内容:

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

    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

这意味着对于Passport,您将不使用会话。 基本上,Laravel Passport等待身份验证用户使用“电子邮件”和“密码”的请求。检索后,如果请求中输入的密码与检索到的记录的密码匹配(当然需要解密),那么系统将生成令牌并将其作为响应发送,并带有200状态代码。如果密码不匹配,则它将发送带有422状态代码的相应错误消息。这是正常的方式。 但是您可以使用以下方法自己模仿令牌:

public function loginUserViaPassport($user_id) {
    $user = User::findOrFail($user_id); // some user
    $app_name = 'Laravel'; // or config('app.name');
    $token = $user->createToken($app_name . ' Password Grant Client')->accessToken;
    return response()->json([
        'token' => $token,
    ], 200);
}

因此,在这里您可以自己使用此块的第4行。

下面更新

对不起,请谅解。我实际上只是写过有关Passport的文章。但是逻辑是一样的:例如,如果您为Laravel应用(例如基于OAuth2系统的Passport)编写带有JSON请求-响应的RESTful API,那么您将无法通过传统会话对用户进行身份验证。如果您丢失了数据库,则也将丢失经过身份验证的用户。因此,对于身份验证,您(作为客户端)

  1. 需要将您的凭据(电子邮件/用户名和密码)发送到服务器(作为后端laravel应用)

  2. 服务器将根据当前用户ID进行检查(通过发送的电子邮件找到用户)

  3. 如果检查成功,它将返回令牌(在大多数情况下,令牌将具有到期时间),否则将返回有关带有有效状态码的无效凭据的信息

  4. 如果检查成功,则客户端只能使用该令牌访问其私人信息,该令牌将保留在请求标头中(例如,用于Bearer身份验证)

这些是有关RESTful API的最短指南,我希望这将有助于理解您无法通过以下方式进行登录模仿: Auth :: guard('api')-> login($ user);