如何在 React 中将 JWT 发送到后端?
Posted
技术标签:
【中文标题】如何在 React 中将 JWT 发送到后端?【英文标题】:How to send JWT to backend in React? 【发布时间】:2021-12-20 14:22:29 【问题描述】:我觉得这应该很容易,但我不明白。
我的 React (Next.js) 应用程序使用 NextAuth.js 从 OAuth 提供者获取 JWT 令牌。现在我需要在执行 GraphQL 查询时将此 JWT 发送到我的后端,为此我使用 graphql-request
。
但是如何在我的 GraphQL 查询中包含 JWT?我可以在我的请求中设置标头 Authorization: Bearer $TOKEN
,但是,JWT 设置为 httpOnly cookie,使其对我的 react 应用程序不可用。
我觉得应该有一种方法可以让浏览器将 cookie 添加到我的请求中。那可能吗?这个一般是怎么解决的?
更新 1
浏览器不会自动发送cookies:
POST /graphql HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 172
sec-ch-ua: "Google Chrome";v="95", "Chromium";v="95", ";Not A Brand";v="99"
accept: application/json
content-type: application/json
sec-ch-ua-mobile: ?0
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/95.0.4638.69 Safari/537.36
sec-ch-ua-platform: "Windows"
Origin: http://localhost:3000
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: http://localhost:3000/
Accept-Encoding: gzip, deflate, br
Accept-Language: en-US,en;q=0.9,de;q=0.8,fr;q=0.7
请注意,我的 webapp 在端口 3000 上运行,而 GraphQL 在 8080 上运行。据我所知,Cookie 不是特定于端口的,当我打开 https://localhost:8080 时,我确实看到了 http://localhost:3000 Chrome 的开发者控制台中的 cookie。
【问题讨论】:
【参考方案1】:浏览器会自动发送带有请求的cookie。
【讨论】:
显然不是这样,请参阅更新后的问题【参考方案2】:好的,所以我必须像这样设置credentials: "include"
:
new GraphQLClient(ENDPOINT,
headers: accept: "application/json",
credentials: "include"
)
然后,我点击CORS Not Supporting Credentials,要求我在服务器端明确配置允许的来源。
【讨论】:
以上是关于如何在 React 中将 JWT 发送到后端?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 JWT 从前端(角度 4)将密钥传递到后端(节点 js)
如何通过 MDC 将从 JWT 获取的用户 ID 添加到后端日志?