Authentication 有没有办法通过编程生成CouchDB cookie?

Authentication 有没有办法通过编程生成CouchDB cookie?,authentication,couchdb,Authentication,Couchdb,我正在开发一个应用程序,它将使用CouchDB为用户存储一些数据。但我不希望用户直接登录CouchDB 我将有一个应用程序客户端(移动/网络)、一个应用程序服务器和CouchDB服务器。客户端应用程序将向应用程序服务器进行身份验证,然后myy的理想方案是让我的应用程序服务器以编程方式对用户进行身份验证,然后只向客户端应用程序发送10分钟的cookie 也就是说,我希望应用服务器代表应用客户端的用户从CouchDB服务器请求一个Cookie,然后只将Cookie发送到应用客户端 应用服务器可以代表

我正在开发一个应用程序,它将使用CouchDB为用户存储一些数据。但我不希望用户直接登录CouchDB

我将有一个应用程序客户端(移动/网络)、一个应用程序服务器和CouchDB服务器。客户端应用程序将向应用程序服务器进行身份验证,然后myy的理想方案是让我的应用程序服务器以编程方式对用户进行身份验证,然后只向客户端应用程序发送10分钟的cookie

也就是说,我希望应用服务器代表应用客户端的用户从CouchDB服务器请求一个Cookie,然后只将Cookie发送到应用客户端

应用服务器可以代表经过身份验证的用户发布到_会话,但这需要:

  • 在应用服务器中维护用户密码列表
  • 为所有用户使用一个已知的密码
  • 为每个身份验证请求将密码重置为随机值
  • 出于安全考虑,#3似乎是最好的,但这似乎是额外的工作,而且是到DB的额外往返(尽管不是很昂贵)。所以我的问题是:作为管理员,是否有任何方法可以代表用户生成cookie,而根本不使用用户的密码

    作为一种额外的安全措施,这还可能允许我完全拒绝除我的应用服务器之外的对_会话的请求


    为了完整起见,我还将提到,我已经研究了这些其他选项,发现它们缺少:

  • 这个永不过期的事实令我担忧。这意味着被破坏的令牌将授予对用户数据的永久访问权。在AFAICT中,如果不更改用户名或服务器密码(这实际上也会使其他所有人的身份验证令牌失效),令牌甚至不能失效。但也许我遗漏了什么

  • 这似乎正好解决了问题。现在,我必须存储OAuth机密,而不是在我的服务器应用程序中存储用户密码。另外,现在我的服务器和客户端代码必须更加复杂


  • 我没有遵循你的确切目标。您似乎暗示用户可能拥有密码(“通过编程验证用户的应用服务器”),但您不希望用户“永远需要知道他们的CouchDB密码”。您想要什么样的身份验证

    对于CouchDB的身份验证,我采用了两种(半)通用方法:

  • “中间人[软件]”方法,在CouchDB前面有瘦中间件。该中间件将用户名/密码转发给“/\u会话”,该会话根据CouchDB\u用户数据库生成cookie或错误代码。中间件将这个cookie从CouchDB复制到它自己的HTTP响应上,并返回给客户端(或者在出现错误时显示一条消息)。然后,对于需要访问数据库的后续请求,它将cookie(现在来自客户机请求)再次转发回数据库

  • 传统的方法是,只使用CouchDB作为数据存储并维护自己的“用户”条目/索引。确保您使用当前密码存储/处理的最佳实践,或使用为您处理这些详细信息的库。中间件作为“自身”连接到数据库,并根据自己的会话处理,使用自己的逻辑处理读/写权限

  • 或者-某种混合方法-您可以使用“/\u session”API仅查看CouchDB是否接受用户名+密码作为有效。如果是,则为该用户创建一个单独的中间件处理的会话。(基本上,您只使用CouchDB的_用户数据库作为“密码处理库”,其余的是传统方法,即访问控制全部在中间件中实现,而不是在数据库中实现。)

  • 对于现实世界中的产品,我倾向于只使用后两种方法(或者考虑到前面的编号,使用1.5种方法…)-第一种方法很有趣,但是CouchDB缺乏文档级的读取权限通常意味着让用户几乎直接访问数据库服务器在实践中是站不住脚的


    更新:您的问题现在清楚地表明,您希望客户端应用程序直接与两台服务器通信:应用程序(以前称为“中间件”)服务器和CouchDB(数据库)服务器。我留下上面的内容是因为我认为它仍然有点有用,并为这次更新提供了一些背景/背景

    您的怀疑是对的,这是一个错误的解决方案:它不是为了最终用户使用,而是为了取代上面第1部分的cookie转发“技巧”。也就是说,代理身份验证是指您完全信任一方(即您的中间件)在代表用户工作时提供用户信息。但是您希望用户直接与数据库对话,并且不能使用
    X-Auth-CouchDB-Token
    信任他们

    我将遵从您对OAuth选项的判断。我确实认为它更接近您想要的,但很明显,您是在根据不同的服务对用户进行身份验证,而不需要存储本身。OAuth 1.0要求的请求签名确实意味着您的客户端应用程序的HTTP库也需要支持

    我看到了一些选项,在不构建自定义CouchDB插件的情况下,可以让您的应用服务器将令牌分发给经过身份验证的用户,而您的数据库服务器将接受这些令牌:

  • 毕竟是代理!也就是说,将数据库服务器隐藏在应用服务器或另一个轻量级自定义反向代理之后。这个中间件需要做的就是检查现有的客户端应用程序会话(cookie或其他身份验证头),如果它有效,设置CouchDB将接受的内部会话,然后它逐字转发其余的请求/响应

  • 确定性密码,每个用户,如果它让你感觉更好。将应用程序服务器配置为只有它知道的秘密,然后设置每个用户pas
    def generate_couchdb_cookie(couchAddress, couchSecret, username):
    
        timestamp = format(int(time.time()), 'X')
        data      = username + ":" + timestamp
    
        server    = pycouchdb.Server(couchAddress)
        db        = server.database("_users")
        doc       = db.get("org.couchdb.user:" + username)
        salt      = doc["salt"]
        secret    = couchSecret + salt
    
        hashed    = hmac.new(secret.encode(), data.encode(), hashlib.sha1).digest()
        inbytes   = data.encode() + ":".encode() + hashed
        result    = base64.urlsafe_b64encode(inbytes)
    
        return "AuthSession=" + (result.decode("utf-8")).rstrip('=')