将访问令牌存储在用户的集合中更好还是分开?

Posted

技术标签:

【中文标题】将访问令牌存储在用户的集合中更好还是分开?【英文标题】:Storing access tokens in the user's collection is better or separate? 【发布时间】:2019-02-07 18:31:26 【问题描述】:

我正在使用 mongodbpython 并试图弄清楚我应该如何存储访问令牌,是否应该使用嵌入式文档并将访问令牌存储在同一个用户的集合中,或者创建一个名为 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 集成。在这种情况下,您需要撤销一个令牌并保留另一个令牌。在这种情况下,将令牌保留在用户对象中会变得不必要地复杂。 我知道,但是这个动作不会太频繁,也不会那么复杂,而且我们还可以使用嵌入式文档管理多个访问令牌。

以上是关于将访问令牌存储在用户的集合中更好还是分开?的主要内容,如果未能解决你的问题,请参考以下文章

JAVA集合框架特征介绍

Java - 集合框架完全解析

Java - 集合框架完全解析

将 QFile 正确存储在集合中

AndroidQ兼容性适配指南

AndroidQ兼容性适配指南