Laravel Sanctum如何为未登录的React Native应用用户开放API并通过通用令牌实现访问限制?
当然可以实现这个需求!我之前在项目里处理过类似的场景,下面给你梳理具体的实现思路和代码示例,保证清晰好上手:
核心思路
我们可以用一枚固定的客户端通用令牌来做验证:移动端未登录用户请求开放API时,在请求头里携带这个令牌;Laravel后端通过自定义中间件验证令牌的有效性,同时可结合User-Agent请求头进一步限制只有你的React Native应用发起的请求能通过,既开放指定API,又能有效防止恶意爬取或非法请求。
具体实现步骤
1. 配置通用令牌
首先在Laravel后端的.env文件里添加一个专属的移动端公开令牌:
APP_MOBILE_PUBLIC_TOKEN=your-strong-secret-token-here
然后在config/app.php里注册这个配置项,方便后续调用:
return [ // 其他配置... 'mobile_public_token' => env('APP_MOBILE_PUBLIC_TOKEN'), ];
2. 创建自定义验证中间件
运行Artisan命令生成中间件:
php artisan make:middleware ValidateMobilePublicToken
打开app/Http/Middleware/ValidateMobilePublicToken.php,编写验证逻辑:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Symfony\Component\HttpFoundation\Response; class ValidateMobilePublicToken { public function handle(Request $request, Closure $next): Response { // 获取请求头里的令牌 $requestToken = $request->header('X-Mobile-Public-Token'); // 获取配置里的令牌 $validToken = config('app.mobile_public_token'); // 验证令牌是否有效 if (!$requestToken || $requestToken !== $validToken) { return response()->json(['message' => 'Unauthorized'], Response::HTTP_FORBIDDEN); } // 可选:验证User-Agent,确保是你的React Native应用 $userAgent = $request->header('User-Agent'); $allowedUserAgent = 'MyReactNativeApp/1.0.0'; // 替换成你的APP标识 if (strpos($userAgent, $allowedUserAgent) === false) { return response()->json(['message' => 'Invalid client'], Response::HTTP_FORBIDDEN); } return $next($request); } }
3. 注册中间件
打开app/Http/Kernel.php,把自定义中间件添加到路由中间件数组里:
protected $routeMiddleware = [ // 其他中间件... 'mobile.public' => \App\Http\Middleware\ValidateMobilePublicToken::class, ];
4. 给开放API应用中间件
在routes/api.php里,把需要未登录访问的API路由用这个中间件包裹:
use App\Http\Controllers\PostController; use App\Http\Controllers\CategoryController; Route::middleware('mobile.public')->group(function () { Route::get('/posts', [PostController::class, 'index']); Route::get('/categories', [CategoryController::class, 'index']); // 其他你需要开放的未登录API });
5. React Native端请求配置
在React Native的请求工具里(比如Axios或Fetch),给开放API的请求添加令牌和自定义User-Agent:
用Axios的示例:
import axios from 'axios'; import { ENV } from './env'; // 假设你用react-native-dotenv管理环境变量 const apiClient = axios.create({ baseURL: ENV.API_BASE_URL, }); // 请求拦截器,自动添加令牌和User-Agent apiClient.interceptors.request.use((config) => { // 给开放API添加令牌(或者全局添加,根据你的路由规则调整) if (['/posts', '/categories'].includes(config.url)) { config.headers['X-Mobile-Public-Token'] = ENV.MOBILE_PUBLIC_TOKEN; } // 设置自定义User-Agent config.headers['User-Agent'] = 'MyReactNativeApp/1.0.0'; return config; }); export default apiClient;
注意事项
- 令牌保密:不要把令牌硬编码在React Native代码里,一定要用环境变量管理(比如
react-native-dotenv),避免打包后泄露。 - User-Agent只是辅助:虽然可以验证
User-Agent,但它很容易被伪造,所以令牌验证是核心,User-Agent只是额外的一层防护。 - 定期轮换令牌:如果担心令牌泄露,可以定期更换
.env里的令牌,同时更新React Native端的环境变量。 - 权限隔离:确保这个中间件只应用在需要开放的API上,不要给需要登录的API使用,避免权限混乱。
内容的提问来源于stack exchange,提问作者Nausif
相关产品推荐
相关产品推荐

