【问题标题】:Single API use for authenticated and guest user单一 API 用于经过身份验证的用户和来宾用户
【发布时间】:2019-11-14 04:15:01
【问题描述】:

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

我在这两种情况下都通过了授权令牌,但中间件路由我得到了用户详细信息,但非中间件路由我没有得到用户信息。

请指导我在哪里可以错过什么?

【问题讨论】:

  • 在此处粘贴您的控制器方法see_all_product 代码
  • @SalmanZafar 根据以下详细信息获取用户详细信息&lt;?php use Illuminate\Http\Request; Route::group(['middleware' =&gt; 'auth:api'], function(){ Route::post('see_all_product', 'API\ProductController@see_all_product'); }); ?&gt; 不根据以下详细信息获取用户详细信息&lt;?php use Illuminate\Http\Request; Route::post('see_all_product', 'API\ProductController@see_all_product'); ?&gt;
  • 在您的问题中添加此代码
  • 你是从 laravel 内部还是从 postman 之类的东西发出请求?
  • @Cameron 邮递员

标签: laravel laravel-5 laravel-passport


【解决方案1】:

我没有在旧版本的 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

【讨论】:

    【解决方案2】:

    关闭['middleware'=&gt; 'auth:api']

    在您的controller 中使用:$request-&gt;user('api');Guests 可以使用api 但用户是null;

    Auth 用户可以作为真实用户使用api

    替代:

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

    【讨论】:

      【解决方案3】:

      我觉得你可以顺便代替$request-&gt;user():

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

      【讨论】:

      • 空白用户无效。如果我改变我的路线,那么工作但面临非授权用户的问题。 &lt;?php use Illuminate\Http\Request; Route::group(['middleware' =&gt; 'auth:api'], function(){ Route::post('see_all_product', 'API\ProductController@see_all_product'); }); ?&gt;
      • 那么你有更深层次的问题,因为这应该在未经授权的端点上工作。你的守护者和提供者是什么?您在身份验证设置中有任何特定设置吗?
      • 我更改了回复。你会像这样检查并重试吗?
      猜你喜欢
      • 2019-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-30
      • 2020-11-15
      • 2016-01-17
      • 2017-09-11
      • 1970-01-01
      相关资源
      最近更新 更多