我正在使用Laravel passport进行API身份验证,当我将其与一个DB一起使用时,它可以完美地工作,但当使用多个数据库时,它会给出401
,
我正在做的事情:
>
oauth_clients
的子数据库将从主数据库复制密码授予令牌和个人访问令牌DB,并在子DB中插入,还在oauth_personal_access_clients
中插入client_id
。 我正在做护照:安装命令所做的所有过程。(如果我没有错过什么)。
当我从master DB使用凭据登录时,它工作得很好,真正的问题开始于我从子数据库使用凭据登录时,我可以从参数客户端代码
获取子DB,我在登录时使用电子邮件
,密码
输入该参数。
它允许我从sub DB登录,但我得到401未经验证的
错误,在登录时获得访问令牌,并且在从Angular
front登录后,我在每个请求上通过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.4
Passport 4.0
Angular 4.4
前端
这是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,并使用有效负载触发初始请求。
回答你的问题:是的,你可以!
在我们的中间件中,我们执行以下操作:
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令牌寿命。有人说过期日期没有根据任何要求进行检查。 是真的吗?如果是真的,那么列的目的是什么?有人能解释