Laravel 8 Passport - 多重身份验证设置
Laravel 8 Passport - Multi Auth setup
我正尝试在 Laravel 8 中与两名警卫一起设置 Passport,但 运行 仍然存在问题。我正在使用 Postman 进行测试。
我有两个 table 设置:
- 用户
- 联系人
我可以在两个 table 中成功注册用户。但是,我只能在用户 table 的登录方法中验证和检索令牌。我一直在联系人 table 上收到“无效凭据”。我很确定这是因为它在尝试对用户进行身份验证时查看的是用户 table 而不是联系人 table。我想我在设置过程中遗漏了一些东西,以允许在验证时使用不同的 table。
我的代码如下:
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]);
}
}
在 crmAuthController.php 登录方法中,当您使用 auth()->attempt($loginData) 时,它会验证默认用户的登录数据 table。
因此,在您的案例中,您必须使用“联系人”模型通过电子邮件获取 crm 用户,而不是使用 attempt($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();
我正尝试在 Laravel 8 中与两名警卫一起设置 Passport,但 运行 仍然存在问题。我正在使用 Postman 进行测试。
我有两个 table 设置:
- 用户
- 联系人
我可以在两个 table 中成功注册用户。但是,我只能在用户 table 的登录方法中验证和检索令牌。我一直在联系人 table 上收到“无效凭据”。我很确定这是因为它在尝试对用户进行身份验证时查看的是用户 table 而不是联系人 table。我想我在设置过程中遗漏了一些东西,以允许在验证时使用不同的 table。
我的代码如下:
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]);
}
}
在 crmAuthController.php 登录方法中,当您使用 auth()->attempt($loginData) 时,它会验证默认用户的登录数据 table。
因此,在您的案例中,您必须使用“联系人”模型通过电子邮件获取 crm 用户,而不是使用 attempt($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();