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

使用Angular和Laravel Passport授权码模式实现用户认证遇路由问题

Laravel Passport + Angular 第一方用户认证解决方案(解决Route [login] not defined错误)

问题原因

/oauth/authorize路由被Passport的会话认证中间件保护,要求用户必须先处于登录状态(持有Laravel会话cookie)。当未认证用户访问该端点时,框架会尝试跳转到名为login的路由,但你未定义此路由,因此抛出错误。

第一方应用的正确实现步骤(无需password grant)

因为你是第一方前端应用,推荐使用带PKCE的Authorization Code Grant(官方推荐的SPA认证方案),具体操作如下:

1. 实现API登录接口(创建用户会话)

Passport的授权端点依赖Laravel的web会话,所以需要先让前端通过API完成登录,生成会话凭证:

  • 添加登录路由到routes/api.php:
Route::post('/login', [AuthController::class, 'login']);
  • 编写登录控制器逻辑:
// app/Http/Controllers/AuthController.php
use Illuminate\Support\Facades\Auth;

public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required'
    ]);

    if (Auth::attempt($credentials)) {
        $request->session()->regenerate();
        return response()->json(['message' => '登录成功']);
    }

    return response()->json(['message' => '账号或密码错误'], 401);
}

此接口验证用户账号密码后,会创建Laravel会话,返回的laravel_session和XSRF-TOKEN cookie是后续授权请求的凭证。

2. 配置Passport适配SPA场景

在app/Providers/AuthServiceProvider.php的boot方法中添加以下配置:

use Laravel\Passport\Passport;

public function boot()
{
    $this->registerPolicies();

    Passport::routes();
    // 启用PKCE(SPA必备,避免凭证泄露)
    Passport::enablePkce();
    // 第一方应用可跳过手动授权确认
    Passport::tokensCan([
        'user' => '访问用户基础信息'
    ]);
    Passport::setDefaultScope(['user']);
}

同时创建SPA类型的Passport客户端:

php artisan passport:client --spa

此命令生成的客户端无需secret(SPA无法安全存储secret)。

3. 前端(Angular)流程调整

  1. 先登录:调用/api/login接口,发送邮箱和密码,请求时配置withCredentials: true(让HttpClient自动携带并保存会话cookie)。
  2. 发起授权请求:登录成功后,向/oauth/authorize发送GET请求,携带以下参数:
    • client_id: 你的SPA客户端ID
    • redirect_uri: 前端接收授权码的回调地址
    • response_type: code
    • scope: 配置的权限范围(如user)
    • state: 随机生成的防CSRF字符串
    • code_challenge: PKCE挑战字符串(前端基于随机code_verifier生成)
    • code_challenge_method: S256
  3. 换取token:授权成功后,Laravel会跳转到redirect_uri并携带code参数,前端获取该code后,向/oauth/token发送POST请求,携带以下参数换取access_token:
    • client_id: 客户端ID
    • redirect_uri: 回调地址
    • grant_type: authorization_code
    • code: 授权码
    • code_verifier: 之前生成的PKCE验证字符串

4. 解决Route [login] not defined错误

如果未登录时访问授权端点仍需友好提示,可在routes/web.php定义login路由:

Route::get('/login', function () {
    // 跳转到前端登录页面
    return redirect(env('FRONTEND_URL') . '/login');
})->name('login');

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:55:13