Laravel护照使用了错误的警卫

时间:2020-10-22 10:15:51

标签: php laravel laravel-passport

我正在使用Laravel护照进行API身份验证,并使用api提供程序“ user”和网络提供程序“ admin”。但是,我的API登录URL一直使用默认的Web提供程序,而不是其自己的提供程序。

config / auth.php:

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

        'api' => [
            'driver' => 'passport',
            'provider' => 'user',
            'hash' => 'false',
        ],
    ],


'providers' => [
        'admin' => [
            'driver' => 'eloquent',
            'model' => App\Admin::class,
        ],

        'user' => [
           'driver' => 'eloquent',
           'model' => App\Models\User::class,
         ],
    ],

用户模型:

<?php

namespace App;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
  
  use \App\Http\Traits\UsesUuid, HasApiTokens,Notifiable;
  
  protected $table = 'user';
  protected $primaryKey = 'user_id';

  protected $fillable =
   ['user_id',
   'user_fname',
   'user_lname',
   'user_email',
   'password',
   'user_contact',
   'user_token' ];

   protected $hidden = [
    'password', 'remember_token',
  ];

  protected $casts = [
    'email_verified_at' => 'datetime',
  ];

  public function setPasswordAttribute($password)
  {
      $this->attributes['password'] = bcrypt($password);
  }


}

管理员模型:

<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class Admin extends Authenticatable
{
    use Notifiable;

  protected $table = 'admin';
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'name', 'email', 'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
    ];


    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime'
    ];
    
}

API身份验证控制器:

public function login(Request $request){

      $credentials = request(['user_email', 'password']);
      
      if(!auth()->attempt($credentials)){
        return response()->json([
          "message"=>"Invalid credentials"
        ], 201);
      }

      $accessToken = auth()->user()->createToken('authToken')->accessToken;

        return response()->json([
          "message"=>"Login successful",
          "user"=>auth()->user(),
          "access_token"=>$accessToken
        ], 201);

    }

登录路线:

Route::post('/login', 'AuthController@login');

我的错误是登录路由使用默认的Admin模型而不是为API提供程序指定的用户模型,这给了我这个错误:

Illuminate\Database\QueryException: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'user_email' in 'where clause' (SQL: select * from `admin` where `user_email` = user@gmail.com limit 1) 

我在https://laracasts.com/discuss/channels/laravel/changing-the-model-provider-laravel-passport-authenticates-against处遇到了类似的错误,并尝试了在https://github.com/laravel/passport/issues/161#issuecomment-299690583处建议的修复程序,但这些方法不起作用

1 个答案:

答案 0 :(得分:1)

您需要创建user保护,因为您需要userssession驱动程序来调用attempt()函数

config / auth.php:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'admin',
    ],
    'user' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
    'api' => [
        'driver' => 'passport',
        'provider' => 'user',
        'hash' => 'false',
    ],
],

然后您的代码应该是这样

public function login(Request $request)
{

    $credentials = request(['user_email', 'password']);

    if (!auth()->guard('user')->attempt($credentials)) {
        return response()->json([
            "message" => "Invalid credentials"
        ], 201);
    }

    $accessToken = auth()->guard('user')->user()->createToken('authToken')->accessToken;

    return response()->json([
        "message" => "Login successful",
        "user" => auth()->user(),
        "access_token" => $accessToken
    ], 201);
}

注意:-,我们创建了新的警卫,因为护照司机不允许使用attempt()表已设置的webadmin警卫,因此