如何在Hasura中利用Action获取Token后发起带Token的Get请求且不存储Token?
实现步骤
1. 定义Hasura业务查询Action
在Hasura控制台创建一个Query类型的Action,命名为fetchProtectedData,用于触发完整的请求流程。定义对应的GraphQL Schema:
type Query { fetchProtectedData: ProtectedDataResponse } # 根据目标Get API的返回结构自定义响应字段 type ProtectedDataResponse { id: Int! name: String! description: String }
2. 编写Action处理函数
在处理函数中完成两步操作:先调用外部API获取access token,再用该token发起目标Get请求。全程token仅在内存中流转,不会持久化存储。
以Node.js为例,处理函数示例(依赖axios):
const axios = require('axios'); module.exports = async (req) => { try { // 第一步:请求外部API获取access token const tokenRes = await axios.post('https://external-auth-api.com/token', { client_id: '你的客户端ID', client_secret: '你的客户端密钥', grant_type: 'client_credentials' // 按外部API授权类型调整 }); const accessToken = tokenRes.data.access_token; // 第二步:用token发起目标Get请求 const dataRes = await axios.get('https://protected-api.com/target-data', { headers: { 'Authorization': `Bearer ${accessToken}` } }); // 映射并返回结果给Hasura return { id: dataRes.data.id, name: dataRes.data.name, description: dataRes.data.desc }; } catch (err) { // 捕获并返回错误信息 return { __typename: 'ActionError', message: err.response?.data?.message || '请求失败' }; } };
3. 配置Action Webhook
将处理函数部署为Web服务(比如Vercel、Heroku或自建服务器),然后在Hasura控制台的Action配置中,填写Webhook地址,请求方法设为POST。
4. 测试调用
在Hasura GraphQL控制台执行以下查询,即可触发完整流程:
query { fetchProtectedData { id name description } }
关键注意点
- 处理函数需添加异常捕获,避免单个请求失败导致整个流程中断。
- 外部Token API的认证参数(如client_id、用户名密码)需根据实际接口要求调整。
- token仅在当前请求的内存生命周期中存在,请求结束后自动销毁,无存储风险。
内容的提问来源于stack exchange,提问作者Sara
相关产品推荐
相关产品推荐

