【发布时间】:2020-03-16 02:42:24
【问题描述】:
我看到很多人有类似的问题,但没有最终解决的解决方案。我一直在努力让它工作大约 24 小时,但仍然没有运气!
目标
- 使用 Laravel 6 和 Dingo API 构建和 API
- 能够在外部使用 API,通过 Passport oAuth 进行身份验证。
- 能够在内部通过 ajax 使用护照自验证功能使用 API。
- 能够通过 PHP 使用 dingo 的自消费方法在内部使用 API。
到目前为止我发现了什么
身份验证提供者顺序
我见过的大多数解决方案都建议同时设置护照身份验证和 dingo。这是auth:api(护照)和api.auth(野狗)。
// API route middleware
$api->group(['middleware' => 'auth:api', 'api.auth'], function (Router $api) {
...
这里的api.auth 实际上是在 laravel 中设置的自定义身份验证提供程序,并配置为 dingo,它将护照逻辑桥接到 dingo。
// Auth provider
class DingoPassportAuthProvider extends Authorization
{
protected $guard;
public function __construct(AuthManager $auth)
{
dump('DingoPassportAuthProvider Instantiated');
$this->guard = $auth->guard('api');
}
public function authenticate(Request $request, Route $route)
{
if ($this->guard->check()) {
return $this->guard->user();
}
throw new UnauthorizedHttpException('Not authenticated via Passport.');
}
public function getAuthorizationMethod()
{
return 'Bearer';
}
}
// Configured in dingo (Api.php)
'auth' => [
'passport' => \App\Providers\DingoPassportAuthProvider::class,
],
如果我们将 dingo API 提供程序放在中间件堆栈的首位,我们会得到:
如果您使用 be() 方法为调用指定用户,则内部 API 请求有效:
$this->api->be($request->user())->get('/api/profile')外部 API 请求和内部 AJAX 请求正确验证,并且用户从自定义 dingo 身份验证提供程序返回,但是,由于某种原因,您无法从 API 控制器中访问此用户:
$user = $request->user(); // null
如果我们将 Passport API 提供程序放在中间件堆栈的首位,我们会得到:
内部 API 请求根本不起作用(总是返回 401)
外部 API 请求和内部 AJAX 请求按预期工作。
不再调用 dingo 护照提供程序上的
authenticate方法。我认为这可能与内部调用返回的 401 有关。
我认为正确的方法是将护照身份验证放在首位。这样,我们在调用 dingo 身份验证之前对用户进行身份验证,导致两件事:
Passport 按预期在本地运行。
Dingo 内部 API 调用现在应该只能使用
$this->api->get('/api/profile')调用(省略使用be()定义用户),但这不起作用。
目前我有以前的配置。 Passport 在外部和 ajax 调用中正常工作,但内部 dingo 调用总是返回 401。
我检查了一些样板模板,它们似乎没有什么不同。我想知道 L6 中是否发生了一些变化来解释为什么内部请求不起作用。
【问题讨论】:
标签: php laravel authentication laravel-passport dingo-api