设置 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()

获取用户