php - 如何在 Laravel 中对两种用户同时使用 web 和 api?
问题描述
我正在使用刀片引擎做一个 RESTful API(用于移动应用程序)和一个 Web 界面。我有两种用户,一种是“gestionnaire”(用于网络界面),另一种是“客户端”(用于移动应用程序)。
现在我可以使用php artisan make:auth
命令对用户“gestionnaire”进行身份验证,但即使我修改了 auth.php,我也无法对客户端进行身份验证,如下所示:
'defaults' => [
'guard' => 'web',
'passwords' => 'clients',
],
'guards' => [
'api' => [
'driver' => 'passport',
'provider' => 'clients',
'hash' => false,
],
'web' => [
'driver' => 'session',
'provider' => 'gestionnaires',
],
],
'providers' => [
'clients' => [
'driver' => 'eloquent',
'model' => App\Client::class,
],
'gestionnaires' => [
'driver' => 'eloquent',
'model' => App\Gestionnaire::class,
],
],
'passwords' => [
'clients' => [
'provider' => 'clients',
'table' => 'password_resets',
'expire' => 60,
],
],
目前我的控制器看起来像这样:
class LoginController extends Controller
{
use AuthenticatesUsers;
protected $redirectTo = '/home';
public function __construct()
{
$this->middleware('guest')->except('logout');
}
}
和这个 :
class AuthController extends Controller
{
public function login(Request $request) {
$request->validate([
'email' => 'required|string|email',
'password' => 'required|string',
//'remember_me' => 'boolean'
]);
$credentials = request(['email', 'password']);
if(!Auth::attempt($credentials))
return response()->json([
'message' => 'Unauthorized'
], 401);
$user = $request->user();
$tokenResult = $user->createToken('Personal Access Token');
$token = $tokenResult->token;
if ($request->remember_me)
$token->expires_at = Carbon::now()->addWeeks(1);
$token->save();
return response()->json([
'access_token' => $tokenResult->accessToken,
'token_type' => 'Bearer',
'expires_at' => Carbon::parse(
$tokenResult->token->expires_at
)->toDateTimeString()
]);
}
public function user(Request $request)
{
return response()->json($request->user());
}
}
我的路线web.php
如下所示:
Route::get('/', function () { return view('welcome'); });
Auth::routes();
Route::get('/home', 'HomeController@index')->name('home');
而在api.php
Route::group([
'prefix' => 'auth'
], function () {
Route::post('login', 'Auth\AuthController@login')->name('login');
Route::post('register', 'Auth\AuthController@register');
Route::group([
'middleware' => 'auth:api'
], function() {
Route::get('logout', 'Auth\AuthController@logout');
Route::get('user', 'Auth\AuthController@user');
});
});
使用此代码
我可以通过 Web 界面进行连接,但不能通过 API 进行连接。我正在Postman
处理请求,但收到以下消息:Unauthorized
当我尝试登录时。
我已经检查了我的请求正文(电子邮件和密码)并且它是正确的。
有人知道我应该做什么吗?
解决方案
你可以Auth::shouldUse('api');
在api中使用。
或者
您可以为此创建中间件
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
use App\User;
class ConditionalApisHandler
{
public function handle($request, Closure $next)
{
Auth::shouldUse('api');
return $next($request);
}
}
在 api.php
Route::group(['middleware' => 'conditionalApisHandler'], function(){
Route::post('example','API\ExampleController@example');
});
推荐阅读
- r - 混合效应模型的 Cohen d
- c++ - QApplication setFont() 和 QTimer
- mapping - 如何仅根据其 URL 验证来自 Wiremock 部署到远程主机的请求?
- assembly - 使用 int 13h 02h 加载在 qemu 和 bochs 中可以正常工作,但在硬件上不行
- python - 迭代切片数组的计算效果
- html - 无法让背景图片显示在网站上
- python - 如何在 Python 中删除 \n 换行符?
- jquery - 单击时显示和隐藏工具提示 (Tipso.js)
- ios - 本地通知与 APNS:我可以有一个计时器定期获取通知并在本地安排它们以避免使用 APNS?
- global-variables - 优化的 ELF 二进制文件中的全局变量名称