ChatGPT解决这个技术问题 Extra ChatGPT

Facebook OAuth2 中 access_token 的长度是多少?

我在 Google 和 StackOverflow 上搜索以找到我的问题的答案,但我找不到。

我想将 access_token 存储到我的数据库中以供离线访问,并且我想确保指定列的正确长度。

我什至找不到它只是一个数字还是数字和字符串之间的混合。


C
Christopher Blizzard

我在 Facebook 工作,对此我可以给出明确的答案。

请不要为访问令牌的存储设置最大大小。我们预计,随着我们添加和删除数据并更改它们的编码方式,它们会随着时间的推移而增长和缩小。

我们确实在一个地方给出了关于它是 255 个字符的指导。我更新了包含该信息的博客文章并更新了我们的新访问令牌文档以包含有关大小的注释:

https://developers.facebook.com/docs/facebook-login/access-tokens/

对困惑感到抱歉。


Facebook 的明确回答是我们稍后会改变它,这很合适。
至少这样我可以期待改变,所以我不会毫无准备。
完全没有限制有点痛苦,因为我们目前将它存储在 300 字节的 varchar2 中,并且今天开始遇到 301-305 字节令牌的问题。你是在建议我们改用 clob 吗?还是有一些我们可以使用的相当大的尺寸?
下次有人问我“我们应该为这个字段设置哪个最大大小”=>“不要设置任何最大大小,它无论如何都会增长”,我肯定会保留这个答案。真的,我喜欢!! Facebook 你让我很开心;)
MySQL 对此有一个上限。请给出一个现实的上限。例如 1000 个字符、10,000 个字符、1,000,000,000 个字符?没有上限是不合理的。
J
Johnny Oshika

随着 Facebook 最近转向加密访问令牌,访问令牌的长度可以达到 255 个字符。如果您将访问令牌存储在数据库中,则该列应该至少能够容纳 varchar(255)。以下是 2011 年 10 月 4 日 Facebook 开发者博客的摘录:

“启用加密访问令牌迁移后,访问令牌的格式已更改。新的访问令牌格式完全不透明,您不应依赖代码中的格式。varchar(255) 字段足以存储新令牌。”

完整的博文在这里:https://developers.facebook.com/blog/post/572


+1 获取更新信息。这应该是现在公认的答案。
似乎不再有效。我最近收到了一个 256 个字符长度的访问令牌。
与上面的@o_o 相同。我们越来越多地获得 240 多个字符长的令牌,其中包括现在的 255 多个。
那很奇怪。在 8000 个样本中,我见过的最长的是 126 个字符。
我们最近看到了 344 个字符访问令牌。
g
gerry3

这个答案不再正确,我在 FB 的文档中找不到更正的值。我们收到了超过 255 个字符的访问令牌。我们正在从 VARCHAR 转移到 SMALLTEXT,而不是尝试面向未来的事情。


是的,我在生产应用程序中有 284 个字符,所以由于列是 varchar(255) 而出现数据库错误...
相同的。刚拿到257
SMALLTEXT 还是 MEDIUMTEXT?我以前也将我的 access_token 限制为 VARCHAR(255),我今天正在处理它的后果。
C
Community

来自 The OAuth 2.0 Authorization Protocol (draft-ietf-oauth-v2-22) 的第 1.4 节

根据资源服务器的安全要求,访问令牌可以具有不同的格式、结构和使用方法(例如加密属性)。访问令牌属性和用于访问受保护资源的方法超出了本规范的范围,由配套规范定义。

我查找了“配套规范”,但没有找到任何相关内容,并且在第 11.2.2 节中指出

参数名称:access_token o 参数使用位置:授权响应、令牌响应 o 变更控制器:IETF o 规范文档:[[ 本文档]]

这似乎表明 access_token 参数是在本规范中定义的。我猜这个参数是,但实际的访问令牌并没有完全充实。

更新:此规范编写的最新版本 (draft-ietf-oauth-v2-31) 包括一个附录,该附录更好地定义了 access_token 参数的期望

A.12。 "access_token" 语法 "access_token" 元素在第 4.2.2 节和第 5.1 节中定义: access-token = 1*VSCHAR

所以本质上这意味着 access_token 应该至少有 1 个字符长,但本规范中定义的长度没有限制。

请注意,他们定义 VSCHAR = %x20-7E


p
palinium

Facebook 访问令牌可以超过 255 个字符。我有很多错误,例如 ActiveRecord::StatementInvalid: PG::StringDataRightTruncation: ERROR: value too long for type character varying(255),其中的值是 facebook 访问令牌。不要使用 string 类型的列,因为它的长度是有限的。您可以使用 text 类型列来存储令牌。


M
Matt Miller

最近,我们的应用程序看到它们超过 100 个字符。我仍在寻找文档,以便为他们找出“安全”的字段大小。


你说的这个“文档”是什么? :D
C
Cyril N.

我会根据花费的时间更新答案。

从 OAuth2 文档中,

本规范未定义访问令牌字符串大小。客户应避免对价值大小做出假设。授权服务器应该记录它发出的任何值的大小。

this document 的第 4.2.2 节)

注意:Facebook 正在使用 OAuth2,如 this page 中所述。

所以现在,Facebook 的开发者门户上似乎没有关于 OAuth 令牌长度的信息。 Yahoo 似乎使用 400 位长的标记,因此最好假设 MySQL 中的 TEXT 列比 varchar 更安全。


Facebook dev api 的文档 - 完全狡猾,没有在任何地方指定字段长度!