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模型引入HasApiTokenstrait: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
相关产品推荐
相关产品推荐

