设置 Laravel 的 OAuth 2.0 是 Dingo API
Setting up Laravel's OAuth 2.0 is Dingo API
我将 Laravel 5.3 与 Dingo API 一起使用,我正在尝试让 Laravel 的 OAuth 2.0(又名护照)与 Dingo 的身份验证一起使用。
我在 config/api.php
中添加了 OAuth 2.0 提供程序,我发现 here:
'auth' => [
'oauth' => function($app) {
$provider = new Dingo\Api\Auth\LeagueOAuth2Provider($app['oauth2.resource-server']);
$provider->setUserCallback(function($id) {
return User::find($id);
});
$provider->setClientCallback(function($id) {
return Client::find($id);
});
return $provider;
}
]
然后我将 api.auth
中间件添加到我的路由中:
$api = app('Dingo\Api\Routing\Router');
$api->version('v2', function($api) {
# ...
$api->get('test', ['middleware' => 'api.auth', 'App\Http\Controllers\v2\SnippetController@test']);
});
并且当请求 /api/test
时,我收到一个 500
HTTP 响应并出现此错误:
Call to undefined method Closure::authenticate()
可以找到完整的 JSON 响应(包括跟踪)here
遗憾的是 the docs 几乎没有提到使用 league/oauth2-server
设置 Dingo,这正是 Laravel 使用的
根据文档,您应该检查并将配置更改为:
'jwt' => 'Dingo\Api\Auth\Provider\JWT'
查看 GitHub
上的问题
希望对您有所帮助!
我必须使用以下代码在 app/Providers/PassportDingoProvider.php
上创建一个新提供程序:
<?php
namespace App\Providers;
use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Illuminate\Auth\AuthManager;
use Dingo\Api\Auth\Provider\Authorization;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
class PassportDingoProvider extends Authorization
{
/**
* Illuminate authentication manager.
*
* @var \Illuminate\Contracts\Auth\Guard
*/
protected $auth;
/**
* The guard driver name.
*
* @var string
*/
protected $guard = 'api';
/**
* Create a new basic provider instance.
*
* @param \Illuminate\Auth\AuthManager $auth
*/
public function __construct(AuthManager $auth)
{
$this->auth = $auth->guard($this->guard);
}
/**
* Authenticate request with a Illuminate Guard.
*
* @param \Illuminate\Http\Request $request
* @param \Dingo\Api\Routing\Route $route
*
* @return mixed
*/
public function authenticate(Request $request, Route $route)
{
if (! $user = $this->auth->user()) {
throw new UnauthorizedHttpException(
get_class($this),
'Invalid API token'
);
}
return $user;
}
/**
* Get the providers authorization method.
*
* @return string
*/
public function getAuthorizationMethod()
{
return 'Bearer';
}
}
然后我在 config/api.php
中添加了这个:
'auth' => [
'custom' => \App\Providers\PassportDingoProvider::class
]
后来,我能够使用 api.auth
中间件来验证我的路由。
您也可以通过 Auth::guard('api')->user()
而不是 Auth::user()
获取用户
我将 Laravel 5.3 与 Dingo API 一起使用,我正在尝试让 Laravel 的 OAuth 2.0(又名护照)与 Dingo 的身份验证一起使用。
我在 config/api.php
中添加了 OAuth 2.0 提供程序,我发现 here:
'auth' => [
'oauth' => function($app) {
$provider = new Dingo\Api\Auth\LeagueOAuth2Provider($app['oauth2.resource-server']);
$provider->setUserCallback(function($id) {
return User::find($id);
});
$provider->setClientCallback(function($id) {
return Client::find($id);
});
return $provider;
}
]
然后我将 api.auth
中间件添加到我的路由中:
$api = app('Dingo\Api\Routing\Router');
$api->version('v2', function($api) {
# ...
$api->get('test', ['middleware' => 'api.auth', 'App\Http\Controllers\v2\SnippetController@test']);
});
并且当请求 /api/test
时,我收到一个 500
HTTP 响应并出现此错误:
Call to undefined method Closure::authenticate()
可以找到完整的 JSON 响应(包括跟踪)here
遗憾的是 the docs 几乎没有提到使用 league/oauth2-server
设置 Dingo,这正是 Laravel 使用的
根据文档,您应该检查并将配置更改为:
'jwt' => 'Dingo\Api\Auth\Provider\JWT'
查看 GitHub
上的问题希望对您有所帮助!
我必须使用以下代码在 app/Providers/PassportDingoProvider.php
上创建一个新提供程序:
<?php
namespace App\Providers;
use Dingo\Api\Routing\Route;
use Illuminate\Http\Request;
use Illuminate\Auth\AuthManager;
use Dingo\Api\Auth\Provider\Authorization;
use Symfony\Component\HttpKernel\Exception\UnauthorizedHttpException;
class PassportDingoProvider extends Authorization
{
/**
* Illuminate authentication manager.
*
* @var \Illuminate\Contracts\Auth\Guard
*/
protected $auth;
/**
* The guard driver name.
*
* @var string
*/
protected $guard = 'api';
/**
* Create a new basic provider instance.
*
* @param \Illuminate\Auth\AuthManager $auth
*/
public function __construct(AuthManager $auth)
{
$this->auth = $auth->guard($this->guard);
}
/**
* Authenticate request with a Illuminate Guard.
*
* @param \Illuminate\Http\Request $request
* @param \Dingo\Api\Routing\Route $route
*
* @return mixed
*/
public function authenticate(Request $request, Route $route)
{
if (! $user = $this->auth->user()) {
throw new UnauthorizedHttpException(
get_class($this),
'Invalid API token'
);
}
return $user;
}
/**
* Get the providers authorization method.
*
* @return string
*/
public function getAuthorizationMethod()
{
return 'Bearer';
}
}
然后我在 config/api.php
中添加了这个:
'auth' => [
'custom' => \App\Providers\PassportDingoProvider::class
]
后来,我能够使用 api.auth
中间件来验证我的路由。
您也可以通过 Auth::guard('api')->user()
而不是 Auth::user()