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

寻求Python端访问Laravel Sanctum接口的示例或工具库

Laravel Sanctum Python客户端调用实现方案

核心误解纠正

你提到的/user接口是需要认证后才能访问的,并非用于提交账号密码获取CSRF令牌的入口。Laravel Sanctum的认证流程分两种常见场景,以下分别给出Python实现:


场景1:API令牌认证(推荐独立Python客户端使用)

这种方式无需处理Cookie和CSRF逻辑,只需携带Bearer令牌即可完成认证。

前置准备

先在Laravel后台实现登录接口,用于通过账号密码获取API令牌:

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

    if (!Auth::attempt($credentials)) {
        return response()->json(['message' => 'Unauthorized'], 401);
    }

    $user = Auth::user();
    $token = $user->createToken('python-client')->plainTextToken;

    return response()->json(['token' => $token]);
});

Python调用示例(基于requests库)

import requests

BASE_URL = "http://your-laravel-api-domain.com"

# 1. 登录获取API令牌
login_payload = {
    "email": "your-user-email@example.com",
    "password": "your-user-password"
}
login_res = requests.post(f"{BASE_URL}/login", data=login_payload)
if login_res.status_code != 200:
    print("登录失败:", login_res.json())
    exit()

auth_token = login_res.json()["token"]

# 2. 调用需要认证的接口
headers = {"Authorization": f"Bearer {auth_token}"}

# 获取当前用户信息
user_res = requests.get(f"{BASE_URL}/user", headers=headers)
print("用户信息:", user_res.json())

# 调用v1/xxx详情接口
target_xxx_uuid = "your-target-xxx-uuid"
xxx_res = requests.get(f"{BASE_URL}/v1/xxx/{target_xxx_uuid}", headers=headers)
print("XXX资源数据:", xxx_res.json())

场景2:Cookie会话认证(适合信任域内的客户端)

如果Python客户端与Laravel API处于同域或信任域,可使用会话认证方式:

Python调用示例(基于requests库)

import requests

BASE_URL = "http://your-laravel-api-domain.com"
# 创建会话对象自动管理Cookie
session = requests.Session()

# 1. 获取CSRF令牌(此接口无需认证)
session.get(f"{BASE_URL}/sanctum/csrf-cookie")

# 2. 登录建立会话
login_payload = {
    "email": "your-user-email@example.com",
    "password": "your-user-password"
}
login_res = session.post(f"{BASE_URL}/login", data=login_payload)
if login_res.status_code != 200:
    print("登录失败:", login_res.json())
    exit()

# 3. 调用认证接口(会话自动携带Cookie和CSRF头)
user_res = session.get(f"{BASE_URL}/user")
print("用户信息:", user_res.json())

target_xxx_uuid = "your-target-xxx-uuid"
xxx_res = session.get(f"{BASE_URL}/v1/xxx/{target_xxx_uuid}")
print("XXX资源数据:", xxx_res.json())

额外代码漏洞修复提示

你提供的XxxController的show方法存在权限控制逻辑漏洞:

// 原错误代码
if (Auth::user()->xxxs()->where('uuid', $xxxId)) {

查询构造器对象永远会被判定为true,导致权限校验失效,应修改为:

// 修正后代码
if (Auth::user()->xxxs()->where('uuid', $xxxId)->exists()) {

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:57:46