寻求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
相关产品推荐
相关产品推荐

