laravel 用于已验证用户和访客用户的单一API

cczfrluj  于 2023-04-22  发布在  其他
关注(0)|答案(3)|浏览(172)

我在routes/api.php上配置的laravel应用程序路由是。

<?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对于经过身份验证的用户和访客用户是相同的。
我在两种情况下都传递授权令牌,但中间件路由我获得用户详细信息,但非中间件路由我不获得用户信息。
请告诉我哪里可以错过什么?

0vvn1miw

0vvn1miw1#

我想你可以用$request->user()来代替:

if (auth('api')->check()) { 
    $user = auth('api')->user();
}
l7wslrjt

l7wslrjt2#

我没有在旧版本的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']],
        
});
?>

现在,auth()-〉user()将返回用户(如果用户通过了身份验证)和null(如果没有通过身份验证)

w8rqjzmb

w8rqjzmb3#

关闭['middleware'=> 'auth:api']
在你的controller中用途:$request->user('api');Guests可以使用api,但用户是null;
Auth用户可以将api作为真实的用户使用。
备选:

Auth::guard('api')->user();

auth('api')->user();

相关问题