You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Passport问题:提供有效凭证仍提示需用户名和密码

解决Laravel Passport调用oauth/token时提示需用户名密码的问题

我之前踩过类似的坑,咱们一步步来排查解决:

1. 先确认请求参数的键名是否正确

Passport的oauth/token端点默认认的是username字段,不是email!很多人会下意识传email,导致系统识别不到登录凭证,就会一直提示需要用户名和密码。

  • 正确的请求参数应该包含这些项:
    • grant_type: password
    • username: 你的用户邮箱(因为Laravel默认用邮箱作为登录标识)
    • password: 用户明文密码(不是加密后的bcrypt值)
    • client_id: 你的Passport密码客户端ID
    • client_secret: 你的Passport密码客户端密钥
  • 比如用Postman测试时,表单格式要确保键名是username,别写成email。

2. 检查Passport客户端类型是否正确

你是不是用了错误的客户端类型?只有密码授权客户端才能用密码模式请求令牌,如果你创建的是个人访问客户端或者授权码客户端,肯定会出问题。

  • 重新创建密码客户端的命令:
php artisan passport:client --password

执行后会生成对应的client_id和client_secret,请求时一定要用这组值。

3. 验证User模型的Passport配置

你的User模型有没有正确引入Passport的Trait?这一步很容易漏:

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens; // 必须加上这个Trait

    // ... 其他模型代码
}

4. 检查Auth配置文件是否正确

打开config/auth.php,确认api守卫的驱动是passport:

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

    'api' => [
        'driver' => 'passport', // 这里必须是passport,不能是session或者其他
        'provider' => 'users',
    ],
],

5. 确认请求的Content-Type是否正确

如果是用JSON格式传参,请求头必须设置Content-Type: application/json,参数也要是标准JSON结构:

{
    "grant_type": "password",
    "username": "iljimae.ic@gmail.com",
    "password": "testing",
    "client_id": "你的客户端ID",
    "client_secret": "你的客户端密钥"
}

如果是表单提交,就用Content-Type: application/x-www-form-urlencoded。

6. 排查密码是否被重复加密

你注册用户时用了bcrypt('testing')是对的,但要留意有没有重复加密的情况:比如User模型的boot方法或者观察者里,是不是又自动对密码做了加密处理?这样会导致数据库里的密码是双重加密的,自然匹配不上明文密码。

先从这几点逐一排查,应该能解决问题。

内容的提问来源于stack exchange,提问作者Wai Yan Hein

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:41:39