Laravel Passport 注册用户凭据不正确

Posted

技术标签:

【中文标题】Laravel Passport 注册用户凭据不正确【英文标题】:Laravel Passport Register the user credentials were incorrect 【发布时间】:2017-12-23 14:13:00 【问题描述】:

我设置了 Laravel Passport,目前我正在尝试使用 Post Route 注册用户。我确实在Controllers/Api/Auth 中创建了一个RegisterController

因此,我创建了一个客户表,它看起来非常像用户表。 如果我调用路由,就会创建客户端,但我没有获得访问令牌或刷新令牌。

到我的控制器的路由如下所示(路由/api):

Route::post('register', ['as' => 'register', 'uses' => 'Api\Auth\RegisterController@register']);

我的控制器如下所示:

<?php

namespace App\Http\Controllers\Api\Auth;


use App\Client;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Route;
use Laravel\Passport\Client as PClient;

use Illuminate\Http\Request;

class RegisterController extends Controller

    private $client;

    public function __construct() 
        $this->client = PClient::find(1);
    

    public function register(Request $request)
    
        $this->validate($request, [
            'name' => 'required',
            'email' => 'required|email|unique:users,email',
            'password' => 'required|min:6|confirmed'
        ]);

        $client_user = Client::create([
            'name' => request('name'),
            'email' => request('email'),
            'password' => bcrypt(request('password'))
        ]);

        $params = [
            'grant_type' => 'password',
            'client_id' => $this->client->id,
            'client_secret' => $this->client->secret,
            'username' => request('email'),
            'password' => request('password'),
            'scope' => '*'
        ];

        $request->request->add($params);
        $proxy = Request::create('oauth/token', 'POST');
        return Route::dispatch($proxy);
    

这是我的客户端模型:

class Client extends Model implements AuthenticatableContract,
                                      AuthorizableContract,
                                      CanResetPasswordContract

    use Authenticatable, Authorizable, CanResetPassword, HasApiTokens, Notifiable;

    protected $table = 'clients';

    protected $fillable = ['name', 'email', 'password'];

    protected $hidden = ['password', 'remember_token'];

当我尝试使用 Postman 调用它时,我收到以下错误消息:

【问题讨论】:

【参考方案1】:

我在这里可能不太确定,但由于您的bcrypt('password') 呼叫,您似乎正在使用密码“password”创建您的客户端。

不应该是bcrypt(request('password'))吗?

这可以解释为什么您的凭据在您的请求中是错误的,因为它们是 ; )

【讨论】:

完全误读了问题,然后误判了你的答案,所以实际上 +1 ? 首先感谢您的回答,我更改了该行并更新了问题中的控制器,但仍然收到相同的错误消息 好的,如果我将客户端更改为用户,这很奇怪,但我不明白为什么会有想法?【参考方案2】:

好的,我修好了,如果我使用 User 模型而不是我的 Client 模型,则发布路线有效,所以我猜肯定有一些不同的东西。

经过一番研究,我发现需要添加模型,在我的例子中,客户端模型添加到 config/auth.php 内的 providers 数组中。

所以第一个需要像这样更改 api 保护:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'passport',
        'provider' => 'clients',
    ],
],

这种api路由登录和注册的方式只对我的客户采取行动。

现在您需要一个新的提供者,在这种情况下需要一个像这样的客户端提供者。

'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'clients' => [
        'driver' => 'eloquent',
        'model' => App\Client::class
    ],
],

如果我调用路由,我会得到一个访问令牌 + 刷新令牌。

【讨论】:

以上是关于Laravel Passport 注册用户凭据不正确的主要内容,如果未能解决你的问题,请参考以下文章

不断收到 401 未经授权的“无效凭据”Laravel Passport

为啥客户凭证应该与 Laravel Passport 中的用户相关联?

Laravel 5.5 - Laravel Passport 使用正确的授权类型?

Laravel passport认证

Laravel 通过 Passport 实现 API 请求认证:沙箱测试篇(私人访问令牌)

如何使用 Laravel Passport 组织这样的路由保护?