Authentication 针对外部服务器对CouchDB用户进行身份验证

Authentication 针对外部服务器对CouchDB用户进行身份验证,authentication,couchdb,pouchdb,Authentication,Couchdb,Pouchdb,我有以下设置: 存储用户和处理身份验证的CouchDB数据库;为每个用户创建一个数据库 使用PockDB通过进行同步和身份验证的Web应用 RESTAPI服务器,从web应用程序获取请求并访问CouchDB 现在,restapi拥有对CouchDB的管理员访问权限,因此当它接收到请求时,它需要进行某种形式的身份验证,以确保发送者对他声称有权访问的数据库拥有权限。由于我使用持久会话,web应用程序并不总是知道用户密码(除非我将其存储在localstorage中,这显然是个坏主意)。会话cookie

我有以下设置:

  • 存储用户和处理身份验证的CouchDB数据库;为每个用户创建一个数据库
  • 使用PockDB通过进行同步和身份验证的Web应用
  • RESTAPI服务器,从web应用程序获取请求并访问CouchDB
  • 现在,restapi拥有对CouchDB的管理员访问权限,因此当它接收到请求时,它需要进行某种形式的身份验证,以确保发送者对他声称有权访问的数据库拥有权限。由于我使用持久会话,web应用程序并不总是知道用户密码(除非我将其存储在localstorage中,这显然是个坏主意)。会话cookie是
    HttpOnly
    ,因此我无法访问它


    在这种情况下,对API的请求进行身份验证的最佳方法是什么?

    加密您需要的所有内容,并将其作为base64会话添加到cookie中。以下是顺序

     1. WebApp: Send username and password
     2. REST: Authenticate this using couch.
     3. REST: Encrypt the session along with username password and create cookie, then base64 result.
     4. REST: Send cookie to WebApp.
     5. WebApp: Alway sends cookie back to REST layer.
     6. REST layer has everything it needs to authenticate the user. 
    
    在上面的示例中,REST层将状态传递给WebApp,并从WebApp获取所需的状态。客户端无法解密它,因此它是安全的。然后,客户机将此令牌作为cookie传递回REST层,然后REST层使用它来获取需要进行身份验证的详细信息

    您可以很容易地加密几百个字节,而不会遇到任何头或头 cookie大小限制。不要在加密之前或之后、之前压缩它 出于安全原因和之后的原因,因为加密的数据不能很好地压缩。如果有人担心性能,那么就对其进行基准测试,但我使用的语言比Rust慢几个数量级。上面的一个变体是使用memcached ie

     1. WebApp: Send username and password
     2. REST: Authenticate this using couch.
     3. REST: Store Couch session in memcahed along with username password and create cookie. The cookie is the key to memcached.
     4. REST: Send cookie to WebApp.
     5. WebApp: Alway sends cookie back to REST layer.
     6. REST: Get details from memcached. 
    
    我使用了这种技术,使用了头文件和cookies,它的效果非常好。我假设你是在用东西来防止XSRF等


    您可以根据应用程序的需要混合和匹配上述内容。

    是Coach的REST层还是独立堆栈,即Java/Tomcat或PHP/Apache等?@Harry independent stack(Rust)。这使事情变得更简单。每个用户的用户名和密码存储在哪里?作为加密数据存储在cookie中。或者,如果您可以在标题中使用标题,这取决于您能够使用什么。两者在实践中都很有效。