如何通过基础HTML表单访问Laravel Sanctum API?
如何通过基础HTML表单访问Laravel Sanctum API?
嘿,我看到你用Postman调用Sanctum API完全没问题,但想切换到基础HTML表单来访问对吧?别担心,我来一步步帮你搞定这件事~
首先得明确:Postman是直接带Token请求API,但HTML表单是通过Cookie会话来和Sanctum做认证的,所以我们需要调整一些配置和表单写法:
1. 先搞定Sanctum的基础配置
1.1 配置状态域
打开config/sanctum.php,找到stateful数组,把你的前端域名(本地开发一般是localhost:8000或者你用的端口)加进去,比如:
'stateful' => explode(',', env('SANCTUM_STATEFUL_DOMAINS', sprintf( '%s%s', 'localhost,localhost:3000,127.0.0.1,127.0.0.1:8000,::1', env('APP_URL') ? ','.parse_url(env('APP_URL'), PHP_URL_HOST) : '' ))),
如果是本地开发,确保localhost:8000在列表里就行。
1.2 调整SESSION和CORS配置
- 在
.env文件里设置SESSION_DOMAIN=localhost(和你的前端域名一致) - 打开
config/cors.php,把supports_credentials改成true,这样浏览器会允许携带Cookie跨域请求。
2. 编写HTML登录表单
你已经有了login-user的API路由,现在写一个HTML表单指向它,关键是要带上CSRF令牌(Laravel的防跨站请求伪造机制要求的):
<!DOCTYPE html> <html> <head> <title>登录访问Sanctum API</title> <!-- 先引入CSRF令牌的meta标签,方便后续表单使用 --> <meta name="csrf-token" content="{{ csrf_token() }}"> </head> <body> <h3>用户登录</h3> <form method="POST" action="/api/login-user"> <!-- 自动生成CSRF令牌字段 --> @csrf <div> <label>邮箱:</label> <input type="email" name="email" required> </div> <div> <label>密码:</label> <input type="password" name="password" required> </div> <button type="submit">登录</button> </form> </body> </html>
登录成功后,Laravel会在浏览器里设置一个Session Cookie,之后的请求就会自动带上这个Cookie来通过auth:sanctum的验证。
3. 编写访问受保护API的表单
现在你可以写表单来访问需要认证的POI接口了:
获取POI列表(GET请求)
<form method="GET" action="/api/poi"> <button type="submit">获取POI列表</button> </form>
提交后,浏览器会自动带上登录后的Session Cookie,就能拿到POI的JSON数据了。
新增POI(POST请求)
<h3>新增POI</h3> <form method="POST" action="/api/store"> @csrf <div> <label>POI名称:</label> <input type="text" name="name" required> </div> <div> <label>POI描述:</label> <textarea name="description" required></textarea> </div> <button type="submit">保存POI</button> </form>
注意POST请求必须带上@csrf字段,不然会被Laravel拒绝。
4. 额外注意事项
- 如果你是在纯静态HTML文件里写表单(不是Laravel的Blade模板),那没法用
@csrf,这时候需要手动获取CSRF令牌:可以先访问Laravel的/csrf-cookie路由,然后从响应的Cookie里取XSRF-TOKEN,再把它作为X-XSRF-TOKEN请求头或者表单的_token字段提交。 - 登录成功后,只要浏览器不清除Cookie,后续的表单请求都会自动带上认证信息,不需要手动加Token。
备注:内容来源于stack exchange,提问作者mas budi
相关产品推荐
相关产品推荐

