【问题标题】:Client authentication failed when trying to get oAuth access token尝试获取 oAuth 访问令牌时客户端身份验证失败
【发布时间】:2015-05-10 21:27:41
【问题描述】:

我正在开发一个使用dingo/apiNeoEloquent 构建的Laravel 4.2 应用程序,以支持图形数据库。我想实现 OAuth,可能使用lucadegasperi/oauth2-server-laravel,但这不适用于 NeoEloquent。在数据库中创建客户端后,尝试 Authorizer::issueAccessToken() 时出现以下错误:

exception 'League\OAuth2\Server\Exception\InvalidClientException' with message 'Client authentication failed.' in /home/vagrant/code/vendor/league/oauth2-server/src/Grant/PasswordGrant.php:114
Stack trace:
#0 /home/vagrant/code/vendor/league/oauth2-server/src/AuthorizationServer.php(275): League\OAuth2\Server\Grant\PasswordGrant->completeFlow()
#1 /home/vagrant/code/vendor/lucadegasperi/oauth2-server-laravel/src/Authorizer.php(80): League\OAuth2\Server\AuthorizationServer->issueAccessToken()
#2 /home/vagrant/code/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(205): LucaDegasperi\OAuth2Server\Authorizer->issueAccessToken()

我找不到任何支持图形数据库或与 NeoEloquent 一起使用的 Laravel 的 OAuth 实现。有没有人知道如何解决这个问题?


更新

我的 composer.json 的一部分:

"require": {
        "laravel/framework": "4.2.*",
        "vinelab/neoeloquent": "*",
        "laravelbook/ardent": "~2.4",
        "doctrine/dbal": "~2.5",
        "lucadegasperi/oauth2-server-laravel": "3.*",
        "dingo/api": "0.8.*"
    },

我所有的模型都扩展了我自己的 NeoArdent,它是 laravelbook/Ardent 的副本,对关系定义进行了一些更改以使其与 NeoEloquent 一起使用。

我的授权类型在 app/config/packages/lucadegasperi/oauth2-server-laravel/oauth2.php

'grant_types' => [
    'password' => [
        'class' => '\League\OAuth2\Server\Grant\PasswordGrant',
        'callback' => function($username, $password) {
            if( Auth::validate([
                'email'    => $username,
                'password' => $password,
            ])){
                $user = User::where('email', $username)->first();
                return $user->id;
            } else {
                return false;
            }
        },
        'access_token_ttl' => 3600
    ]
]

我在 app/config/packages/dingo/api/config.php 中的身份验证提供程序定义

'auth' => [
    'oauth' => function ($app) {
        $provider = new Dingo\Api\Auth\LeagueOAuth2Provider($app['oauth2-server.authorizer']->getChecker());

        $provider->setUserResolver(function ($id) {
            return User::findOrFail($id);
        });

        $provider->setClientResolver(function ($id) {
            return User::findOrFail($id);
        });
        return $provider;
    }
]

在我尝试获取授权码之前,我暂时使用它来创建一个客户端:

if (!DB::table('oauth_clients')->count()) {
    $client = [
        'id' => 'angularApp',
        'secret' => 'angularAppSecret',
        'name' => 'angularApp'
    ];
    DB::table('oauth_clients')->insert($client);
}

然后我这样做:

Auth::login($user);
Input::merge(['grant_type' => 'password', 'client_id' => 'angularApp', 'client_secret' => 'angularAppSecret']);
return AuthorizerFacade::issueAccessToken();

这给了我上面的错误。

我希望这有助于理解我的问题。

【问题讨论】:

  • 这里需要注意的是,没有“集成”b/w Laravel、dingo/api 和 NeoEloquent,它们是应用程序的三个不同“组件”。发布生成此错误的代码会有所帮助,该代码还显示了您如何一起使用这些包。
  • 我添加了一些代码来帮助您更好地理解我的问题。

标签: php laravel oauth-2.0 dingo-api neoeloquent


【解决方案1】:

我等不及了,所以我改用 MongoDB 使用 bmcmurray/ardent-mongodb,这是 laravelbook/Ardent 的一个分支,以支持 jenssegers/laravel-mongodb。我在转换为 Graph 数据库之前使用了 Ardent,然后为 laravelbook/Ardent 构建了自己的 fork 以支持 Vinelab/NeoEloquent,因此我的代码没有太大变化。

在使用 MongoDB 和 OAuth 方面有更多支持,例如发布 this question 的那个人。我确信我现在可以让 OAuth 工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2017-07-03
    • 2018-09-07
    • 2016-07-06
    • 2015-11-03
    • 2021-08-15
    • 2013-12-04
    相关资源
    最近更新 更多