Laravel 5.6电商API订单接口授权防护方案咨询
嘿,我来帮你搞定这个订单接口的防护问题!针对你用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里添加HasApiTokenstrait: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

