有没有办法以编程方式生成CouchDB cookie?

时间:2015-08-30 00:56:58

标签: authentication couchdb

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

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

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

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

  1. 维护用户列表'应用服务器中的密码
  2. 为所有用户使用单个已知密码
  3. 为每个身份验证请求随机重置密码
  4. 出于安全考虑,#3似乎是最好的,但这似乎是额外的工作,并且是DB的额外往返(尽管不是昂贵的)。所以我的问题是:作为管理员,是否有代表用户生成cookie的方式,而不使用用户'密码呢?

    除了我的应用服务器之外,这还可能让我完全拒绝对_session的请求,作为一项额外的安全措施。

    为了完整起见,我还要提到我已经看过这些其他选项,并发现他们想要:

    1. Proxy Auth

      x_auth_token永不过期的事实对我来说是令人担忧的。这意味着受损的令牌将永久授予用户数据的访问权限。而且,在AFAICT中,令牌甚至无法在不更改用户名或服务器密钥的情况下失效(这实际上也会使其他人的身份验证令牌无效)。但也许我在这里遗漏了什么?

    2. OAuth auth

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

1 个答案:

答案 0 :(得分:1)

扩展natevw's brilliant answer。我遇到了类似的问题,从来没有意识到选项3是可能的,没有偶然发现答案。

这是我用于生成cookie的python3实现(使用pycouchdb与沙发连接):

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(secret.encode(), data.encode(), sha1).digest()
    inbytes   = data.encode() + ":".encode() + hashed
    result    = base64.urlsafe_b64encode(inbytes)

    return "AuthSession=" + (result.decode("utf-8")).rstrip('=')