Background
我的应用程序正在从许多不同的源 (API) 获取数据并跨它们进行聚合。因此,用户通过 OAuth2 登录到源一次,然后我不断调用源。
我正在使用thephpleague/oauth2-client
连接到不同的服务,我还使用构建在上面的提供程序包连接到不同的网站。我在那里绝对没有问题。
身份验证后,我会得到一个LeagueOAuth2ClientTokenAccessToken
实例。
现状
现在对于存储,我对AccessToken
实例执行json_encode
并存储生成的非结构化string
。为了加载它,我json_decode
并通过构造函数创建一个新实例。不是很有趣。
问题
如果我想以结构化方式存储访问令牌(通常是 OAuth 响应),我需要哪些数据?服务器到服务器通信需要保留什么?具体项目及其类型?我正在尝试找出用于存储许多不同提供程序的数据模型。
#Sources 答案的来源是 2 倍:
- RFC: https://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
。
- 提到的库: 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
的可选值,作为伪类型int
的值回退到expires
传递到构造函数的任何其他内容都被视为额外数据。
#Implications
access_token
和refresh_token
都应存储为字符串,但需要注意refresh_token
可以为 nulltoken_type
隐含在所使用的库中,在这种情况下不是必需的,但可能适用于其他一些人。expires_in
应存储为时间点的某种表示形式。resource_owner_id
是库可以使用的自定义值名称。如果要使用它,请将其存储为字符串。- 如果应用程序在 API 请求之前测试范围授权,则存储
scope
可能很有用。将其存储为字符串。 - 其他任何内容都是自定义值,应按自定义值处理。不同提供程序之间的值名称重叠的可能性非常低。可以存储为字符串数组。