将访问令牌存储在用户的集合中更好还是分开?
Posted
技术标签:
【中文标题】将访问令牌存储在用户的集合中更好还是分开?【英文标题】:Storing access tokens in the user's collection is better or separate? 【发布时间】:2019-02-07 18:31:26 【问题描述】:我正在使用 mongodb
和 python
并试图弄清楚我应该如何存储访问令牌,是否应该使用嵌入式文档并将访问令牌存储在同一个用户的集合中,或者创建一个名为 collection
的新access_tokens
并在其中保留用户的参考字段?
以下是不同集合的示例:
"_id" : ObjectId("5b8bc5efac5a49b53fddb4d6"),
"name" : "Rohit Khatri",
"email" : "rohit@email.com",
"username" : "rohit",
"password" : "password"
"_id" : ObjectId("5b8bdc2aac5a49b82c1f4e32"),
"token" : "sf33849hskjdfhj9348khsjdf",
"expires_at" : ISODate("2018-09-02T12:48:42.218Z"),
"user_id" :
"$ref" : "users",
"$id" : ObjectId("5b8bc5efac5a49b53fddb4d6")
带有嵌入式集合
"_id" : ObjectId("5b8bc5efac5a49b53fddb4d6"),
"name" : "Rohit Khatri",
"email" : "rohit@email.com",
"username" : "rohit",
"password" : "password",
"access_tokens": [
"token" : "sf33849hskjdfhj9348khsjdf",
"expires_at" : ISODate("2018-09-02T12:48:42.218Z")
]
在性能、可扩展性等方面哪种方式更好?
【问题讨论】:
【参考方案1】:将令牌保存在单独的集合中的一个很好的副作用是,您可以在该集合上使用TTL index 来自动删除较旧的令牌记录。不能保证索引准确地在您在 expires_at 字段中设置的时间运行,但如果以秒为单位的准确性对您来说并不重要,它将非常接近那个时间。这样,您只需要检查令牌是否存在,而不是它是否已过期。
【讨论】:
不关心token是否过期,因为每次调用api时,我都会去取并检查token是否有效,如果没有,则删除token并给出用户出错。 @RohitKhatri 我仍然建议将令牌保存在单独的集合中,因为将来某个时候您可能希望每个用户拥有多个令牌。例如,想象一下,您希望在未来的某个时候提供您的应用与 Facebook 的集成。然后,也许您想提供 Instagram 集成。现在想象一下,用户想要禁用 Facebook 集成但保留 Instagram 集成。在这种情况下,您需要撤销一个令牌并保留另一个令牌。在这种情况下,将令牌保留在用户对象中会变得不必要地复杂。 我知道,但是这个动作不会太频繁,也不会那么复杂,而且我们还可以使用嵌入式文档管理多个访问令牌。以上是关于将访问令牌存储在用户的集合中更好还是分开?的主要内容,如果未能解决你的问题,请参考以下文章