0

我将 Laravel 5.3 与 Dingo API 一起使用,并且我正在尝试让 Laravel 的 OAuth 2.0(又名 Passport)与 Dingo 的身份验证一起使用。

我添加了 OAuth 2.0 提供程序config/api.php,我在这里找到了它:

'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 响应(包括跟踪)可以在这里找到

遗憾的是,文档league/oauth2-server几乎没有提到使用 Laravel设置 Dingo

4

2 回答 2

1

我必须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()

于 2016-11-21T15:41:36.587 回答
-1

根据文档,您应该检查并将配置更改为:

'jwt' => 'Dingo\Api\Auth\Provider\JWT'

在GitHub 上查看问题

希望这可以帮助!

于 2016-11-19T17:32:21.147 回答