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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 04:29:07