我的laravel应用程序路由在routes/api.php上配置是。
<?php
use Illuminate\Http\Request;
Route::post('see_all_product', 'API\ProductController@see_all_product');
?>
问题是我想发送产品列表,但如果用户经过身份验证,则发送产品收藏夹标志 1,如果未经过身份验证,则发送返回收藏夹 0
但这两种情况都会发送带有最喜欢标志的产品列表。
如果我使用用户 ID 和密码登录并发送 see_all_product 请求,那么我将得到空白用户。
$user = $request->user();
但是如果我设置如下所示的路线,我将获得用户详细信息。
<?php
use Illuminate\Http\Request;
Route::group(['middleware' => 'auth:api'], function(){
Route::post('see_all_product', 'API\ProductController@see_all_product');
});
?>
现在的问题是,如果使用相同的 api 在标头中设置授权,我如何获取详细信息。
<?php
use Illuminate\Http\Request;
Route::post('see_all_product', 'API\ProductController@see_all_product');
?>
我的see_all_product功能
public function see_all_product(Request $request){
try {
$user = $request->user();
} catch (Exception $ex) {
Log::error($ex);
}
}
经过身份验证的用户和访客用户的 API 是相同的。
我在这两种情况下都传递了授权令牌,但中间件路由我获取用户详细信息,但非中间件路由我不获取用户信息。
请指导我哪里可能会错过什么?
我想你可以顺便做一下而不是
$request->user()
:
if (auth('api')->check()) {
$user = auth('api')->user();
}
您可以创建另一个中间件,允许经过以太坊身份验证的用户或来宾用户继续。
如果用户通过了身份验证,那么中间件将为您准备 Auth 对象和 auth() 函数。
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Contracts\Auth\Factory as Auth;
use Illuminate\Http\Request;
class AuthOptional
{
/**
* The authentication factory instance.
*
* @var \Illuminate\Contracts\Auth\Factory
*/
protected $auth;
/**
* Create a new middleware instance.
*
* @param \Illuminate\Contracts\Auth\Factory $auth
* @return void
*/
public function __construct(Auth $auth)
{
$this->auth = $auth;
}
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(Request $request, Closure $next, ...$guards)
{
$this->authenticate($request, $next, $guards);
return $next($request);
}
/**
* Determine if the user is logged in to any of the given guards.
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
*/
protected function authenticate($request, $next, array $guards)
{
if (empty($guards)) {
$guards = [null];
}
foreach ($guards as $guard) {
if ($this->auth->guard($guard)->check()) {
return $this->auth->shouldUse($guard);
}
}
//If unauthenticated allow the user anyway
$this->unauthenticated($request, $next, $guards);
}
/**
* Handle an unauthenticated user.
*
* @param \Illuminate\Http\Request $request
* @param array $guards
* @return void
*
*/
protected function unauthenticated($request, $next, array $guards)
{
return $next($request);
}
}
导入app/Http/kernel.php下新建的中间件
protected $routeMiddleware = [
....
'auth.optional' => \App\Http\Middleware\AuthOptional::class
];
最后像这样使用它:
<?php
Route::group(['middleware' => ['auth.optional:api']],
});
?>
现在 auth()->user() 将返回用户(如果用户已通过身份验证)并且 如果不是则为空
关闭
['middleware'=> 'auth:api']
在您的
$request->user('api');
中使用:controller
。
Guests
可以使用 api
但用户是 null
;
Auth
用户可以像真实用户一样使用api
。
替代:
Auth::guard('api')->user();
auth('api')->user();
$middlewares = \Request::header('Authorization') ? ['jwt.verify', 'auth:api'] : [];
Route::middleware($middlewares)->group(function () {
Route::get('/demo/{id}', [App\Http\Controllers\Api\DemoController::class,'demoindex']);
});
基于其他人对此问题的回答。看起来很好用。