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

Laravel 5.6电商API订单接口授权防护方案咨询

如何防护Laravel 5.6订单接口,仅允许独立Angular应用调用

嘿,我来帮你搞定这个订单接口的防护问题!针对你用Laravel 5.6做电商API、前端是独立Angular应用的场景,其实有几个实用的方案,不用死磕Passport的复杂配置,咱们一个个拆解:

方案1:API密钥 + 域名白名单双重验证

这个方案简单直接,适合前后端完全分离的场景,核心是验证请求来源和专属密钥:

  • 步骤1:生成专属API密钥
    在Laravel项目的.env文件里添加一个随机生成的安全密钥:

    ANGULAR_API_KEY=your_secure_random_32_char_key_here
    

    密钥要足够长且随机,别用简单字符串。

  • 步骤2:Angular端携带密钥
    在Angular发送创建订单的请求时,把这个密钥放在自定义请求头里,比如X-API-KEY:

    // Angular示例代码
    const headers = new HttpHeaders().set('X-API-KEY', environment.apiKey);
    this.http.post('/api/orders', orderData, { headers }).subscribe(...);
    

    记得把apiKey存在Angular的环境变量里,别硬编码在代码中。

  • 步骤3:Laravel端创建验证中间件
    生成一个中间件来验证密钥和请求来源:

    php artisan make:middleware VerifyAngularOrigin
    

    打开app/Http/Middleware/VerifyAngularOrigin.php,修改handle方法:

    public function handle($request, Closure $next)
    {
        // 验证API密钥
        $apiKey = $request->header('X-API-KEY');
        if ($apiKey !== env('ANGULAR_API_KEY')) {
            return response()->json(['message' => 'Unauthorized'], 401);
        }
    
        // 验证请求来源域名(可选但更安全)
        $allowedOrigins = ['https://your-angular-app.com']; // 替换成你的Angular域名
        $origin = $request->header('Origin');
        if (!in_array($origin, $allowedOrigins)) {
            return response()->json(['message' => 'Invalid origin'], 403);
        }
    
        return $next($request);
    }
    
  • 步骤4:注册并应用中间件
    在app/Http/Kernel.php的$routeMiddleware数组里添加中间件:

    protected $routeMiddleware = [
        // ...其他中间件
        'angular.auth' => \App\Http\Middleware\VerifyAngularOrigin::class,
    ];
    

    然后把这个中间件绑定到订单创建的路由上:

    Route::post('/orders', 'OrderController@store')->middleware('angular.auth');
    

方案2:Laravel Passport密码授予模式(其实可行!)

你之前试过Passport没找到方案,可能是没用到适合独立前端的密码授予模式。这个方案适合需要用户登录的场景,确保只有登录用户(从你的Angular应用登录)才能创建订单:

  • 步骤1:安装并配置Passport
    执行以下命令安装并初始化Passport:

    composer require laravel/passport
    php artisan migrate
    php artisan passport:install
    
  • 步骤2:配置User模型和Auth服务
    在app/User.php里添加HasApiTokens trait:

    use Laravel\Passport\HasApiTokens;
    
    class User extends Authenticatable
    {
        use HasApiTokens, Notifiable;
        // ...其他代码
    }
    

    在app/Providers/AuthServiceProvider.php的boot方法里注册Passport路由:

    use Laravel\Passport\Passport;
    
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }
    

    修改config/auth.php,把API guard的驱动改成passport:

    'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],
    
        'api' => [
            'driver' => 'passport',
            'provider' => 'users',
        ],
    ],
    
  • 步骤3:Angular端获取并携带Token
    用户登录时,Angular调用Laravel的oauth/token接口获取access token:

    // Angular登录示例
    const loginData = {
        grant_type: 'password',
        client_id: 'your_client_id', // 从passport:install输出里拿
        client_secret: 'your_client_secret', // 同上
        username: userEmail,
        password: userPassword,
        scope: ''
    };
    
    this.http.post('/oauth/token', loginData).subscribe(response => {
        localStorage.setItem('access_token', response.access_token);
    });
    

    创建订单时,在请求头里携带token:

    const token = localStorage.getItem('access_token');
    const headers = new HttpHeaders().set('Authorization', `Bearer ${token}`);
    this.http.post('/api/orders', orderData, { headers }).subscribe(...);
    
  • 步骤4:保护订单路由
    给订单创建路由加上auth:api中间件:

    Route::post('/orders', 'OrderController@store')->middleware('auth:api');
    

方案3:CSRF令牌防护(适合同域/子域场景)

如果你的Angular应用和Laravel API是同域或者子域关系,可以用Laravel自带的CSRF防护:

  • 步骤1:配置CORS允许你的Angular域名
    修改config/cors.php,允许你的Angular域名:

    'paths' => ['api/*'],
    'allowed_methods' => ['*'],
    'allowed_origins' => ['https://your-angular-app.com'], // 替换成你的域名
    'allowed_origins_patterns' => [],
    'allowed_headers' => ['*'],
    'exposed_headers' => [],
    'max_age' => 0,
    'supports_credentials' => true,
    
  • 步骤2:Angular端获取并携带CSRF令牌
    从Laravel的/csrf-cookie接口获取令牌(这个接口会设置XSRF-TOKEN cookie):

    this.http.get('/csrf-cookie').subscribe(() => {
        // 现在可以发送带CSRF令牌的请求了
        const xsrfToken = localStorage.getItem('XSRF-TOKEN');
        const headers = new HttpHeaders().set('X-XSRF-TOKEN', xsrfToken);
        this.http.post('/api/orders', orderData, { headers }).subscribe(...);
    });
    
  • 步骤3:给订单路由启用CSRF防护
    把订单路由放在web中间件组里(因为api中间件默认关闭了CSRF):

    Route::group(['middleware' => 'web'], function () {
        Route::post('/orders', 'OrderController@store');
    });
    

额外注意事项

  • 无论用哪种方案,一定要启用HTTPS,防止密钥、token或敏感数据被明文传输。
  • API密钥要定期更换,并且不要硬编码在Angular代码里,最好通过后端接口在用户登录后返回。
  • 如果用Passport,记得设置合理的token过期时间,并且实现刷新token的逻辑,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:00:25