我有一个节点js服务器和一个android客户端。基本上我有两种身份验证选项:rest api + http basic或sessions。我更喜欢会话,因为将用户凭据存储到手机的内存中并不是一个好主意。会话ID是临时的,因此存储它不会是一个安全问题。
我尝试过以下方法:在节点j上我使用快速会话中间件。在客户端,会话ID存储在变量SID中。对于每个请求,cookie" connect.sid = SID"已设定。如果响应包含set-cookie,则将SID设置为与connect.sid匹配。但是,这种方法不起作用。然而,我可以生成自己的id,而不是使用express。
另外,我不了解快速会话的浏览器行为。我使用https,如果这有任何区别。它运行正常,但首先,所有请求都创建了2个操作:一个使用OPTIONS方法,另一个使用实际操作。对选项请求的响应返回set-cookie。在实际操作请求中,cookie" connect.sid"已设定。在每个请求中,id是相同的但是服务器返回的每个set-cookie具有不同的id,并且客户端发送的id与这些id中的任何id都不匹配。有人可以解释一下发生了什么吗?
如今,使用移动应用程序对服务器进行身份验证是一种非常常见的情况。处理它的推荐方法是什么(没有第三方)?
答案 0 :(得分:0)
有人能解释一下发生了什么吗?
我怀疑你在客户端(Android应用程序)实现cookie处理可能是导致问题的原因。
我开发了一个带有node.js的Android应用程序,我看到了使用RESTful API的类似问题。 就我而言,我使用了Retrofit2 REST库。该库基于OkHttp3 API,用于处理HTTP请求/响应。为了解决我的cookie问题,我在答案https://stackoverflow.com/a/34886860/7183182中包含了代码,其中主要部分是PersistentCookieStore实现和JavaNetCookieJar类。如果使用HttpURLConnection,则可以将PersistentCookieStore实现传递给CookieManager。 Android文档显示了如何使用特定的CookieStore实现here和here。
如今,使用移动应用程序对服务器进行身份验证是一种非常常见的情况。处理它的推荐方法是什么(没有第三方)?
我建议使用OAuth解决方案,其中API密钥(或访问令牌)使用SharedPreferences存储在客户端。
通过cookie传输的会话ID是一种解决方案,但它对于本机或混合移动应用程序来说是个问题。