Laravel 8 Passport - 多重身份验证设置

时间:2020-12-27 13:15:20

标签: php laravel laravel-passport

我试图在 Laravel 8 中设置 Passport 并使用两个守卫,但一直遇到问题。我正在使用 Postman 进行测试。

我设置了两个表:

  1. 用户
  2. 联系人

我可以在两个表中成功注册一个用户。但是,我只能在用户表的登录方法中验证和检索令牌。我一直在联系人表上收到“无效凭据”。我很确定这是因为它在尝试对用户进行身份验证时查看的是用户表而不是联系人表。我想我在设置过程中遗漏了一些东西,以允许在身份验证时使用不同的表。

我的代码如下:

auth.php

'defaults' => [
    'guard' => 'web',
    'passwords' => 'users',
],

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

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

    'api-crm' => [
        'driver' => 'passport',
        'provider' => 'contacts',
        'hash' => false,
    ],
],

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

    'contacts' => [
        'driver' => 'eloquent',
        'model' => App\Models\Contact::class,
    ],
],

api.php

Route::middleware('auth:api')->get('/user', function (Request $request) {
return $request->user();
});

Route::post("/register", [ApiAuthController::class, 'register']);
Route::post("/login", [ApiAuthController::class, 'login']);

Route::post("/crm/register", [CrmAuthController::class, 'register']);
Route::post("/crm/login", [CrmAuthController::class, 'login']);

ApiAuthController.php

namespace App\Http\Controllers\API;

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

class ApiAuthController extends Controller
{
    public function register(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|max:55',
            'email' => 'email|required|unique:users',
            'password' => 'required|confirmed'
        ]);

        $validatedData['password'] = bcrypt($request->password);

        $user = User::create($validatedData);

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

        return response([ 'user' => $user, 'access_token' => $accessToken]);
    }

    public function login(Request $request)
    {
        $loginData = $request->validate([
            'email' => 'email|required',
            'password' => 'required'
        ]);

        if (!auth()->attempt($loginData)) {
            return response(['message' => 'Invalid Credentials']);
        }

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

        return response(['user' => auth()->user(), 'access_token' => $accessToken]);

    }
}

CrmAuthController.php

namespace App\Http\Controllers\CRM;

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

class CrmAuthController extends Controller
{
    public function register(Request $request)
    {
        $validatedData = $request->validate([
            'name' => 'required|max:55',
            'email' => 'email|required|unique:users',
            'password' => 'required|confirmed'
        ]);

        $validatedData['password'] = bcrypt($request->password);

        $user = Contact::create($validatedData);

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

        return response([ 'user' => $user, 'access_token' => $accessToken]);
    }

    public function login(Request $request)
    {
        $loginData = $request->validate([
            'email' => 'email|required',
            'password' => 'required'
        ]);

        if (!auth()->attempt($loginData)) {
            return response(['message' => 'Invalid Credentials']);
        }

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

        return response(['user' => auth()->user(), 'access_token' => $accessToken]);

    }
}

1 个答案:

答案 0 :(得分:1)

在 crmAuthController.php 登录方法中,当您使用 auth()->attempt($loginData) 时,它会验证默认用户表上的登录数据。

因此,在您的案例中,您必须使用“联系”模型通过电子邮件获取 crm 用户,而不是使用尝试($loginData)。

  $loginData = $request->validate([
        'email' => 'email|required',
        'password' => 'required'
    ]);
   $user = new \App\Models\Contact();
   $check = $user->where('email',$loginData['email'])->exists();
   if($check){
    $users = $user->where('email',$loginData['email'])->first();
     // verify the password 
    if (password_verify($loginData['password'],$users->password)) {
        // Authentication passed...
            
         $token = $users->createToken('YOUR TOKEN NAME');
          return response($token);
     }
     else return response(['message' => 'Invalid Credentials']);
   }
   else return response(['message' => 'user doesnt exist with this email']);

此外,一旦您登录,要获取 CRM 的当前用户,请使用

    Auth::guard('api-crm')->user();