【问题标题】:How to implement server side sessions in node.js with express for an android app?如何在 node.js 中使用 express 为 android 应用程序实现服务器端会话?
【发布时间】:2016-01-07 20:00:20
【问题描述】:

大家好,我正在制作一个 android 应用程序,我一次有多个帐户登录现在我的问题是,对于多个登录,我应该使用会话来验证每个登录的帐户用户。现在我正在使用 express服务器端我已经阅读了很多关于在 node.js 中存储会话的文档

  1. Express-session(虽然它只适用于开发,但不适用于生产,但不适用于我的应用)
  2. Cookie 会话
  3. 连接-Redis
  4. 连接-mongo

我还听说过 json web 令牌,我可以在其中生成唯一令牌,然后我可以使用 res.json({user_id:"user1", token: "generated_token here"}) 将令牌传递给客户端 我也听说过护照,但不知道它是如何做到的

现在我的第一个问题是我已经阅读了所有文档,但没有提到我为每个注册用户创建唯一令牌的地方。 第二个问题,当我将我的服务器用于 android 应用程序时,将不会使用 cookie 我将在参数 req.body.token 中发送用户令牌,现在如何将其与当前 user_id 相匹配。

实际上我没有得到控制流,我的意思是在 node.js 的会话中一切是如何进行的。还有什么是这个秘密是这个东西产生独特的令牌或什么。另外我的意思是现在大约有 100000 用户注册了我的应用程序,请相应地告诉我我应该为我的应用程序使用哪种方式。

我之前已经问过这个问题,但我没有提到,因为我没有制作网站如何做到这一点(在我的情况下不会使用令牌)

我知道我要问的这个问题非常模糊,但请多多包涵,我只是想了解 node.js 中如何使用会话

谢谢你

【问题讨论】:

    标签: android node.js session redis express-session


    【解决方案1】:

    我会尝试回答这个问题,但它含糊不清(正如你所指出的那样)。我将假设您的 Android 应用程序是本机 Android 应用程序,并且将连接到基于 ExpressJS 的云中的某种 NodeJS 后端。如果不是这种情况,请在更新您的问题时澄清您的想法。

    对于这种特定情况,最好的办法是查看云提供。例如,Azure App Service 移动应用程序允许您实现身份验证 - 它最终返回一个 JSON Web 令牌 (http://jwt.io) 来对每个请求进行身份验证。

    如果您不想受制于云提供商,而是想自己运行它,那么您将不得不自己实现令牌生成和检查。这通常遵循以下形式:

    • 设置一个 WebAPI 端点(可能是 /signin),它接受身份提供者提供给您的任何令牌,验证信息并返回 JWT - 有一个 NPM 模块 (jsonwebtoken) 用于生成 JWT。确保 JWT 包含您的用户的身份。我倾向于使用电子邮件地址作为身份。
    • 您的 Android 应用程序将使用 Authorization 标头向您的后端发出 WebAPI 请求,其值为“Bearer”
    • 您的 NodeJS API 将使用 JWT 授权来验证 JWT 并提取用户身份,以便您可以在 API 逻辑中使用它。

    在此特定场景中需要注意的重要一点是,您的后端代码正在实现 WebAPI - API 中没有 cookie 或会话。唯一将用户从客户端代码链接到后端代码的是 JWT。

    以下是验证 JWT 的一小段代码:

    var express = require('express');
    var app = express();
    var jwt = require('express-jwt');
    
    var jwtCheck = jwt({
      secret: new Buffer('your-jwt-secret', 'base64'),
      audience: 'your-jwt-audience'
    });
    
    app.get('/api/protected', jwtCheck, (req, res) => {
    // Your code here
    });
    
    app.listen(process.env.PORT || 3000);
    

    【讨论】:

    • 首先你能告诉我这个秘密是什么我也读过cookie-sessions是最快的这就是为什么我在考虑使用它之前你使用过cookie-sessions吗??
    • 你怎么能认为我不需要任何 sessiosn 模块,因为如果我不实现会话,那么我如何检查用户是否已注销??
    • 首先,Cookie 用于 Web 连接 - 而不是 API 连接。您的 Android 应用程序将使用 WebAPI - 没有 cookie。 JWT 是一个会话令牌。真的没有注销 - 您已经验证了拥有令牌的人就是他们所说的那个人。在 JWT 中,您可以指定到期时间。您可以在应用中实现逻辑以定期刷新令牌。
    • 是的,并且对应于您存储此令牌的哪个 user_id 我的意思是您必须将该 user_id 与该令牌一起保存在会话中?明白我的意思
    • 用户 id 实际上会被编码在令牌中。本质上,验证身份的 /signin 将创建一个新令牌。它通过将一些数据创建为对象(其中包括您的数据 - 例如 user_id 以及一些 JWT 数据,例如受众、发行者和到期日)来实现这一点,然后使用客户端密钥和受众信息对该对象进行签名。对于您自己的 JWT,您可以选择这些值 - 它们保留在后端并且对客户端不可用。对于客户端/应用程序,您的 JWT 是传递给后端的不透明 blob。后端可以解码得到原始信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-26
    相关资源
    最近更新 更多