单一 API 用于经过身份验证的用户和来宾用户
Single API use for authenticated and guest user
我在 routes/api.php 上配置的 laravel 应用程序路由是。
<?php
use Illuminate\Http\Request;
Route::post('see_all_product', 'API\ProductController@see_all_product');
?>
问题是我想发送产品列表,但如果用户通过身份验证则发送产品收藏夹标志 1,如果未通过身份验证则发送 return 收藏夹 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');
});
?>
现在的问题是,如果 header 中的授权设置与 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();
}
关闭['middleware'=> 'auth:api']
在您的 controller
中使用:$request->user('api');
。
Guests
可以使用 api
但用户是 null
;
Auth
用户可以使用 api
作为真实用户。
替代:
Auth::guard('api')->user();
auth('api')->user();
我没有在旧版本 Laravel 上测试此方法,但在最新版本上应该可以正常工作。
您可以创建另一个中间件,允许以太币身份验证或来宾用户继续。
如果用户通过了身份验证,那么中间件将为您准备 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']],
});
?>
Now auth()->user() will return the user if user is authenticated and
null if it's not
我在 routes/api.php 上配置的 laravel 应用程序路由是。
<?php
use Illuminate\Http\Request;
Route::post('see_all_product', 'API\ProductController@see_all_product');
?>
问题是我想发送产品列表,但如果用户通过身份验证则发送产品收藏夹标志 1,如果未通过身份验证则发送 return 收藏夹 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');
});
?>
现在的问题是,如果 header 中的授权设置与 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();
}
关闭['middleware'=> 'auth:api']
在您的 controller
中使用:$request->user('api');
。
Guests
可以使用 api
但用户是 null
;
Auth
用户可以使用 api
作为真实用户。
替代:
Auth::guard('api')->user();
auth('api')->user();
我没有在旧版本 Laravel 上测试此方法,但在最新版本上应该可以正常工作。
您可以创建另一个中间件,允许以太币身份验证或来宾用户继续。
如果用户通过了身份验证,那么中间件将为您准备 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']],
});
?>
Now auth()->user() will return the user if user is authenticated and null if it's not