Spring OAuth2,登录成功后在查询参数中返回刷新令牌是否安全?

问题描述

我有一个 React 前端,它使用 Spring OAuth2 后端登录到外部身份提供者。我在寻找一个好的解决方案时遇到了一个问题,即如何在登录完成后安全地将刷新和访问令牌检索回前端。

登录完成后,spring 应用程序将重定向发送回前端应用程序,但此时令牌可用的唯一位置是在 spring 后端的安全上下文中。因此,为了检索令牌,我现在必须向后端发送一个额外的请求,以从安全上下文中获取令牌。

我想知道直接将重定向 url(查询参数)中的刷新令牌返回给应用程序是否安全?如果没有,会面临哪些问题?

解决方法

这将是不安全的,因为刷新令牌将包含在浏览器历史记录和 HTTP 日志中。 OAuth 特意要求如下两个阶段,很多专家从安全角度考虑过:

  • 在用户进行身份验证后,授权重定向会向应用返回一个“一次性使用”授权代码。这是在浏览器中完成的,在那里可能会发生某些类型的攻击和拦截。

  • 接下来,应用程序发送授权代码授予消息,以将代码交换为令牌。令牌在响应正文中返回,不包含在服务器日志或浏览器历史记录中。

对于 OAuth,我总是建议坚持使用基于标准的消息,就像我的 Messages Blog Post 一样。在大多数系统中,您无法更改这些消息,这是一件好事。这样做会降低安全性,还会降低您的应用程序的可移植性。