经过身份验证的用户和来宾用户使用单一 API

问题描述 投票:0回答:4

我的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 是相同的。

我在这两种情况下都传递了授权令牌,但中间件路由我获取用户详细信息,但非中间件路由我不获取用户信息。

请指导我哪里可能会错过什么?

laravel laravel-5 laravel-passport
4个回答
6
投票

我想你可以顺便做一下而不是

$request->user()
:

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

4
投票

我没有在旧版本的 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() 将返回用户(如果用户已通过身份验证)并且 如果不是则为空


3
投票

关闭

['middleware'=> 'auth:api']

在您的

$request->user('api');
中使用:
controller
Guests
可以使用
api
但用户是
null
;

Auth
用户可以像真实用户一样使用
api

替代:

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

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

0
投票
$middlewares = \Request::header('Authorization') ? ['jwt.verify', 'auth:api'] : [];

Route::middleware($middlewares)->group(function () {
    Route::get('/demo/{id}', [App\Http\Controllers\Api\DemoController::class,'demoindex']);
});

基于其他人对此问题的回答。看起来很好用。

© www.soinside.com 2019 - 2024. All rights reserved.