Laravel Passport:仅使用用户名登录,没有密码

Laravel Passport: login using only username without password

在我的项目中,我将通过短信发送确认码来验证用户 phone 号码。确认后,我必须向我的 laravel 应用程序发送登录请求。在 Laravel Passport 文档中有登录用户的示例请求:

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => 'taylor@laravel.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

我如何在这里设置为 username 用户 phone 并删除 password

如果 password 是 Laravel Passport 中的必填字段,那么我可以从客户端发送任何密码,并在 attempt 用户凭据之前发送请求用户 password 的 owerride。但是我必须在哪里输入密码?

我厌倦了改变LoginController但没有工作。

登录控制器

protected function validateLogin(Request $request)
{
    $request->validate([
        $this->username() => 'required|string'
    ]);
}

protected function credentials(Request $request)
{
    $params = [
        'password' => '12345678',
    ];
    $request->request->add($params);
    return $request->only($this->username(), 'password');
}

public function username()
{
    return 'phone';
}

在您的用户模型中使用 findForPassport 方法。

它以用户名作为参数,return用户模型

已回答

class User extends Authenticatable
{
    use Notifiable, HasApiTokens;

    // Set as username any column from users table
    public function findForPassport($username) 
    {
        $customUsername = 'phone';
        return $this->where($customUsername, $username)->first();
    }
    // Owerride password here
    public function validateForPassportPasswordGrant($password)
    {
        $owerridedPassword = 'password';
        return Hash::check($password, $this->password);
    }
}