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

Laravel Passport API:如何实现新用户注册功能?

解决Laravel Passport下的用户注册与登录令牌获取问题

嘿,我明白你的困惑——Laravel Passport 默认确实不会自动提供 register 和 login 这类API路由,因为它的核心职责是处理OAuth2令牌的管理,而用户注册、登录的业务逻辑需要我们自己来实现。别担心,几步就能搞定你的需求:

第一步:确保Passport已正确配置

如果你还没完成Passport的基础安装配置,先执行以下步骤:

  • 安装Passport包:composer require laravel/passport
  • 运行数据库迁移:php artisan migrate
  • 生成Passport所需的加密密钥和客户端:php artisan passport:install
  • 在 app/Providers/AuthServiceProvider.php 的 boot 方法中添加:
    use Laravel\Passport\Passport;
    
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes(); // 注册Passport的OAuth路由
    }
    
  • 让你的 User 模型引入 HasApiTokens trait:
    use Laravel\Passport\HasApiTokens;
    use Illuminate\Foundation\Auth\User as Authenticatable;
    
    class User extends Authenticatable
    {
        use HasApiTokens, Notifiable; // 确保HasApiTokens在这里
        // ... 其他模型代码
    }
    

第二步:实现用户注册功能

1. 添加注册API路由

在 routes/api.php 中添加POST路由:

Route::post('/register', [App\Http\Controllers\Auth\RegisterController::class, 'register']);

2. 创建注册控制器

新建 app/Http/Controllers/Auth/RegisterController.php,编写注册逻辑:

<?php

namespace App\Http\Controllers\Auth;

use App\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Hash;

class RegisterController extends Controller
{
    public function register(Request $request)
    {
        // 验证请求参数
        $validatedData = $request->validate([
            'name' => 'required|string|max:255',
            'email' => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ]);

        // 创建新用户
        $user = User::create([
            'name' => $validatedData['name'],
            'email' => $validatedData['email'],
            'password' => Hash::make($validatedData['password']),
        ]);

        // 生成Passport访问令牌
        $accessToken = $user->createToken('auth_token')->accessToken;

        // 返回包含令牌的JSON响应
        return response()->json([
            'access_token' => $accessToken,
            'token_type' => 'Bearer',
            'user' => $user
        ], 201);
    }
}

第三步:实现登录获取令牌功能

1. 添加登录API路由

同样在 routes/api.php 中添加:

Route::post('/login', [App\Http\Controllers\Auth\LoginController::class, 'login']);

2. 创建登录控制器

新建 app/Http/Controllers/Auth/LoginController.php,编写登录逻辑:

<?php

namespace App\Http\Controllers\Auth;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;

class LoginController extends Controller
{
    public function login(Request $request)
    {
        // 验证登录参数
        $validatedData = $request->validate([
            'email' => 'required|string|email',
            'password' => 'required|string',
        ]);

        // 验证用户凭证是否正确
        if (!Auth::attempt($validatedData)) {
            return response()->json([
                'message' => '邮箱或密码错误'
            ], 401);
        }

        // 获取当前登录用户
        $user = Auth::user();

        // 生成访问令牌
        $accessToken = $user->createToken('auth_token')->accessToken;

        // 返回令牌响应
        return response()->json([
            'access_token' => $accessToken,
            'token_type' => 'Bearer',
            'user' => $user
        ]);
    }
}

测试接口

现在你就可以通过以下方式测试:

  • 注册:发送POST请求到 http://your-domain/api/register,请求体为JSON格式,包含name、email、password、password_confirmation字段
  • 登录:发送POST请求到 http://your-domain/api/login,请求体为JSON格式,包含email和password字段

两个接口都会返回Bearer类型的访问令牌,之后你就可以用这个令牌来访问需要认证的API路由了。

内容的提问来源于stack exchange,提问作者kajdehoop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:39:58