当前位置: 首页 > 知识库问答 >
问题:

Laravel护照给401未经认证的错误

陆安国
2023-03-14

我正在使用Laravel passport进行API身份验证,当我将其与一个DB一起使用时,它可以完美地工作,但当使用多个数据库时,它会给出401

我正在做的事情:

>

  • 我有一个多租户数据库,主数据库有用户、角色和所有OAuth表。
  • 当我创建一个具有管理员角色的用户时,它将创建具有管理员名称的新数据库,它将创建包含用户、角色和所有OAuth表的子数据库。oauth_clients的子数据库将从主数据库复制密码授予令牌和个人访问令牌DB,并在子DB中插入,还在oauth_personal_access_clients中插入client_id
  • 我正在做护照:安装命令所做的所有过程。(如果我没有错过什么)。

    当我从master DB使用凭据登录时,它工作得很好,真正的问题开始于我从子数据库使用凭据登录时,我可以从参数客户端代码获取子DB,我在登录时使用电子邮件密码输入该参数。

    它允许我从sub DB登录,但我得到401未经验证的错误,在登录时获得访问令牌,并且在从Angularfront登录后,我在每个请求上通过Authentication头和Bear

    不知道我错过了什么。

    数据库连接中间件

    DBConnection中间件在登录后对每个请求设置连接,

    public function handle($request, Closure $next)
        {
            if ( $request->method() != 'OPTIONS' ) {            
                $this->access_code = $request->header('access-code'); 
                if ( $this->access_code != '' && $this->access_code != 'sa'  ) {
                    app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_PREFIX.$this->access_code);
                } else {
                    app('App\Http\Controllers\Controller')->setDB(AppHelper::DB_DEFAULT);
                }
            }
            return $next($request);
        }
    

    DBConnection数据库中设置默认数据库。php动态地,为此,我调用在控制器上创建的setDB方法。php

    setDB控制器。php

    public function setDB($database='') {
          $config = app()->make('config');
          $connections = $config->get('database.connections');
          $default_connection = $connections[$config->get('database.default')];
          $new_connection = $default_connection;
          $new_connection['database'] = $database;
          $config->set('database.connections.'.$database, $new_connection);
          $config->set('database.default', $database);
      }
    

    是否可以使用护照与2个不同的数据库为相同的代码?

    Laravel 5.4Passport 4.0Angular 4.4前端

  • 共有2个答案

    柯锋
    2023-03-14

    这是CORS问题。OPTIONS请求不传递授权标头。

    如果源站与主机不同,则浏览器将在任何其他请求之前发送选项。

    Laravel将回答状态401如果CORS中间件没有设置。

    因此,对于RESTful体系结构,如果客户端应用程序主机与API的主机不同,则必须使用CORS中间件。

    你可以用这个:barryvdh/laravel cors

    $ composer require barryvdh/laravel-cors
    

    示例:

    App\Http\Kernel.php

    protected $routeMiddleware = [
        ...
        'auth.cors' => \Barryvdh\Cors\HandleCors::class,
        ...
    ];
    

    web.php

    Route::group([
        'prefix' => 'api',
        'middleware' => [
            'auth.cors'
        ]
    ], function () {
        Route::post('user/authenticate', 'UserController@authenticate');
    });
    

    如果CORS中间件工作正常,浏览器应接收选项请求的状态200,并使用有效负载触发初始请求。

    胡沈义
    2023-03-14

    回答你的问题:是的,你可以!

    在我们的中间件中,我们执行以下操作:

    config([
      'database.connections.tenant.schema' => $tenant
    ]);
    
    DB::connection('tenant')->statement("SET search_path = $tenant");
    

    在我看来,你的search_path没有设置好。这就解释了为什么你会得到401。因为Laravel Passport在错误的数据库中搜索,在其中无法在用户表中找到正确的令牌。

    来自PostgreSQL文档(https://www.postgresql.org/docs/9.1/static/runtime-config-client.html):

    此变量指定当对象(表、数据类型、函数等)被简单名称引用而未指定模式时,模式的搜索顺序。当不同模式中存在同名对象时,将使用搜索路径中最先找到的对象。不在搜索路径中任何架构中的对象只能通过使用限定(虚线)名称指定其包含架构来引用。

     类似资料:
    • 早些时候,当我使用Laravel5.2时,我使用了第三方软件包https://github.com/tymondesigns/jwt-auth/用于进行基于JWT的身份验证。我们只需要传递用户名和密码就可以获得令牌。 现在在laravel 5.3中,随着passport的引入,我想进行基于JWT的身份验证,但passport要求我指定客户端id和客户端密码以及用户名和密码。这在tymondesig

    • 这里使用Passport身份验证中间件,从登录api生成jwt令牌并发送到apihttp://localhost:3030/home/在头球,但它的投掷 错误 有棱角的js:12587员额http://localhost:3030/home/401(未经授权)。 angular.js:14525可能未处理的拒绝:{数据:未授权,状态:401,配置:{方法:POST,转换请求:[空],转换响应:[空

    • 我使用Laravel 5.4 Passport作为个人代币。我正在尝试使用Postman向/api/user发送GET请求。我通过向/oauth/personal access令牌发送get请求来获取令牌。从这个响应中,我获取了我认为是令牌的内容,然后我在Postman中设置了一个GET请求,就像文档中说的添加Accept一样= 登录后,我去http://192.168.10.15/oauth/p

    • 问题内容: 我正在编写一个想同时用作Web应用程序和API提供程序的nodejs应用程序。验证用户身份后,我想为该用户分配一个令牌,以用于后续请求。这对于Web应用程序的通行证非常有用,因为我只是在会话中使用令牌对用户进行序列化和反序列化。但是,在响应API请求时,没有用于设置存储会话信息的cookie。理想情况下,护照将在会话和请求正文中都寻找令牌。有什么方法可以配置通行证来完成此任务吗? 问题

    • 我希望你一切都好。我挣扎了几天,因为Laravel护照,试图用javascript/vuejs消耗我自己的api。最后一个晚上,我几乎阅读了所有关于我问题的帖子,但我找不到任何解决办法。我希望你能帮助我,在这一点上谢谢你。 我已经建立了一个新的laravel应用程序,并安装了Laravel Passport,就像在Laravel 5.8(https://laravel.com/docs/5.8/p

    • 我正在开发标准的LaravelRESTAPI。我正在关注Laravel5.4API认证(Passport)文档。 我需要的是,用户应该通过API登录并获得不会过期的访问令牌。 表具有列。默认值为一年。我把expires_at日期改成了昨天。但它仍然有效。我搜索关于Laravel Passport令牌寿命。有人说过期日期没有根据任何要求进行检查。 是真的吗?如果是真的,那么列的目的是什么?有人能解释