gpt4 book ai didi

php - Laravel 护照出现 401 Unauthenticated 错误

转载 作者:IT王子 更新时间:2023-10-29 01:16:52 28 4
gpt4 key购买 nike

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

我在做什么:

  • 我有一个 Multi-Tenancy 数据库,主数据库有用户、角色和所有 OAuth 表。
  • 当我创建一个具有管理员角色的用户时,它将创建具有管理员名称的新数据库,它将创建具有用户、角色和所有 OAuth 表的子数据库。子DB的oauth_clients会从master DB复制Password Grant Token和Personal Access Token插入子DB,同时在oauth_personal_access_clients中插入client_id
  • 我正在执行 passport:install 命令执行的所有过程。 (如果我没有遗漏任何东西)。

  • 当我使用主数据库的凭据登录时,它工作得很好,当我使用子数据库的凭据登录时,真正的问题开始了,我可以从参数 client_code 获取子数据库,我登录时输入email,password

  • 它允许我从子数据库登录,但我收到 401 Unauthenticated 错误,登录时获取访问 token ,我通过 Authentication header 和 Bearer 在从 Angular 前端登录后的每个请求上。

  • 不知道我在这里遗漏了什么。

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);
}

DBConnectiondatabase.php 中动态设置默认数据库,为此,我调用了在 Controller 上创建的 setDB 方法。 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);
}

是否可以将 passport 与 2 个不同的数据库一起用于相同的代码?

Laravel 5.4护照 4.0Angular 4.4 前端

最佳答案

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

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

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

DB::connection('tenant')->statement("SET search_path = $tenant");

我觉得您的 search_path 设置不正确。这可以解释为什么您会收到 401。因为 Laravel Passport 在错误的数据库中搜索,它无法在您的用户表中找到正确的 token 。

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

search_path (string)

This variable specifies the order in which schemas are searched when an object (table, data type, function, etc.) is referenced by a simple name with no schema specified. When there are objects of identical names in different schemas, the one found first in the search path is used. An object that is not in any of the schemas in the search path can only be referenced by specifying its containing schema with a qualified (dotted) name.

关于php - Laravel 护照出现 401 Unauthenticated 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47594676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com