我需要为 OAuth2 服务器到服务器的通信存储哪些数据?

What data do I need to store for OAuth2 server-to-server communication?

背景

我的应用程序正在从许多不同的来源 (API) 获取数据并在它们之间进行聚合。所以用户通过 OAuth2 登录到源一次,然后我不断地调用源。

我正在使用 thephpleague/oauth2-client 连接到不同的服务,我还使用构建在顶部的提供程序包连接到不同的网站。我完全没有问题。

一旦我进行身份验证,我就会得到一个 League\OAuth2\Client\Token\AccessToken 实例。

现状

现在为了存储,我在 AccessToken 实例上执行 json_encode 并存储生成的非结构化 string。要加载它,我 json_decode 并通过构造函数创建一个新实例。不是很有趣。

问题

如果我想以结构化方式存储访问令牌(通常是 OAuth 响应),我需要哪些数据?对于服务器到服务器的通信,我需要坚持什么?具体项目及其类型?我正在尝试找出用于存储许多不同提供程序的数据模型。

#来源 答案的来源有 2 倍:

  1. RFChttps://www.rfc-editor.org/rfc/rfc6749#section-5.1 - 鉴于 RFC,字段为:
  • access_token - 伪类型的必需值 string
  • token_type - 伪类型的必需值 string
  • expires_in - 伪类型的推荐值int
  • refresh_token - 伪类型的可选值 string
  • scope - 伪类型的可选值 string 在授权范围与请求中要求的范围不同的情况下

RFC 规定 The client MUST ignore unrecognized value names in the response.,但是在本节中提供的示例中,它们包括以前未定义的 value name

  1. 提到的库https://github.com/thephpleague/oauth2-client/blob/master/src/Token/AccessToken.php#L59 - 给定构造函数:
  • access_token - 伪类型的必需值 string
  • resource_owner_id - 伪类型的可选值 string
  • refresh_token - 伪类型的可选值 string
  • expires_in - 伪类型 int 的可选值,回退到 expires 作为伪类型 int
  • 的值

传递给构造函数的任何其他内容都被视为额外数据。

#影响

  • access_tokenrefresh_token 应该存储为字符串,但要注意 refresh_token 可以为 null
  • token_type 隐含在所使用的库中,在这种情况下不是必需的,但可能对其他人来说是必需的。
  • expires_in 应存储为某个时间点的某种表示形式。
  • resource_owner_id 是您的图书馆可以使用的自定义值名称。如果要使用它,请将其存储为字符串。
  • 如果您的应用程序在 API 请求之前测试范围授权,
  • scope 可能有助于存储。将其存储为字符串。
  • 其他任何东西都是自定义值,应该这样对待。不同提供者之间的值名称重叠的可能性很小。可以存储为字符串数组。