单一 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