Laravel护照给出了401 Unauthenticated错误

Nik*_*iya 29 php laravel laravel-passport

我正在使用laravel passport进行API身份验证,当我将它与一个数据库一起使用时,它可以正常工作,但401在使用多个数据库时会提供,

我在做什么:

  • 我有一个多租户数据库,主数据库有用户,角色和所有oauth表.
  • 当我创建具有管理员角色的用户时,它将创建具有管理员名称的新数据库,它将创建包含用户,角色和所有oauth表的子数据库.oauth_clients子分贝将从主数据库复制密码同意令牌和个人访问令牌和子数据库中插入,也插入client_idoauth_personal_access_clients.
  • 我正在做所有passport:install命令的程序.(如果我没有遗漏某些东西).

  • 当我从主DB它完美的凭据登录,真正的问题,当我与子数据库凭据登录开始,我可以从PARAM获得子DB client_code与I输入email,password同时登录.

  • 它允许我从子数据库登录但我得到401 Unauthenticated 错误,登录时获取访问令牌,我从前面登录后通过每个请求传递AuthenticationHeader .BearerAngular

  • 不知道我在这里缺少什么.

DBConnection中间件

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);
    }
Run Code Online (Sandbox Code Playgroud)

DBConnectiondatabase.php动态设置默认数据库,因为我正在调用setDB创建的方法Controller.php

setDB Controller.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);
  }
Run Code Online (Sandbox Code Playgroud)

是否可以使用passport2个不同的数据库进行相同的代码?

Laravel 5.4 Passport 4.0 Angular 4.4 在前端

小智 1

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

在我们的中间件中,我们做了这样的事情:

config([
  'database.connections.tenant.schema' => $tenant
]);

DB::connection('tenant')->statement("SET search_path = $tenant");
Run Code Online (Sandbox Code Playgroud)

在我看来,您的 search_path 设置不正确。这可以解释为什么你会收到401。因为 Laravel Passport 在错误的数据库中搜索,在用户表中找不到正确的令牌。

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

搜索路径(字符串)

此变量指定当通过未指定模式的简单名称引用对象(表、数据类型、函数等)时搜索模式的顺序。当不同模式中存在相同名称的对象时,将使用搜索路径中第一个找到的对象。不属于搜索路径中任何模式的对象只能通过使用限定(点)名称指定其包含模式来引用。