【问题标题】:restful service requires username and password to get the token, is it ok to save the credentials(user and pass) in server side nodejs?restful 服务需要用户名和密码才能获取令牌,是否可以将凭据(用户和密码)保存在服务器端 nodejs 中?
【发布时间】:2019-02-12 23:09:34
【问题描述】:

我有一个应用程序,它从用户那里获取 csv,将其转换为 json 并将 json 文件保存在 AWS 上的 S3 存储桶中。然后我使用 oracle 的 restful 服务将该数据推送到 oracle jde。

用户无法在未经“批准”的情况下上传文件 - 目前这是一个手动过程,但需要先将他们的电子邮件添加到 S3 存储桶 Web 应用程序检查电子邮件是否存在于 S3 中,然后允许文件上传,如果不存在,则文件上传被拒绝。

我暂时没有设置任何其他“用户身份验证”。

接下来,为了从外部 API 获取令牌,我需要向它提供服务帐户用户名和密码,目前,由于它仍在开发中,我将用户名和密码保存在我的服务器端 nodejs 中的一个对象中我将其传递给 api 调用以获取令牌。

暂时我们不打算让用户登录,所以说我怎样才能保护用户名和密码,但仍然能够获得“允许上传的经过身份验证的电子邮件”的令牌?

基本上,我认为仅将其保存在可变的服务器端节点中并不是一个好主意,因此寻找另一种将其存储在某处并且仍然能够调用 api 的方法。

【问题讨论】:

    标签: javascript node.js amazon-web-services rest fetch


    【解决方案1】:

    目前我们不打算让用户登录,因此 说我怎样才能保护用户名和密码,但仍然能够 获取“允许上传经过身份验证的电子邮件”的令牌?

    你不能。除非我误解了什么,否则那些不是“经过身份验证的电子邮件”,它们是“预先批准的电子邮件地址”。您仍然需要对用户进行身份验证以帮助保护应用。

    那么我是否仍然对硬编码的用户名和密码进行哈希和加盐并保存到数据库?

    您不能对密码进行加盐和哈希处理,因为您打算重复使用原始密码。这使您有责任保护密码。不要玩那个游戏。许多人为许多不同的帐户重复使用相同的密码。您是否希望必须向您的用户发送一封电子邮件,让他们知道您存在安全漏洞并且他们需要重置所有密码?

    【讨论】:

    • 所以我可以创建用户身份验证,但是为了真正访问外部服务器 API,我们不能真正创建多个用户名和密码来连接它。它必须是一个唯一的用户名和密码。我该如何处理?一旦用户登录,我仍然需要让节点使用 API 的唯一用户名和密码来获取令牌。
    • 重读您的原始问题后,我发现我错过了有关服务帐户的部分。好的,您仍然应该使用预先批准的电子邮件地址对最终用户进行身份验证。至于保护服务帐户的凭据,您是否有用于部署应用程序的构建过程?将用户名和密码之类的内容保存在源代码控制存储库中通常是一种不好的做法。您可以从 process.env 对象引用环境变量,但您需要一些东西来设置服务器上的值。您可以为此使用构建过程。
    • 谢谢,我还没有构建过程。我确实考虑过使用环境变量。你能指导我正确的方向,以了解如何使用 env 变量执行此构建过程吗?谢谢!
    • 这取决于您的构建过程。但假设您使用 Jenkins 和 Docker 之类的东西,您可以查看以下内容:jenkins.io/doc/book/pipeline/dockerifritltd.com/2017/08/12/…
    【解决方案2】:

    基本上,我认为仅将其保存在可变的服务器端节点中并不是一个好主意

    没错,这不是一个好主意。例如,如果您的服务器死了怎么办?然后你会失去这个价值。更不用说 RAM 的额外成本,因为所有内容都将存储在内存中。

    解决方案

    • 将凭据存储在数据库中。它可以是 SQL 或 NoSQL,服务器可以是你喜欢的任何形式

    注意事项

    • 不要忘记在存储之前对密码进行哈希处理
    • 散列时添加一些salt
    • 要验证密码,只需对您从客户端获得的密码进行哈希处理,并将其与您存储在数据库中的哈希值进行比较
    • 对客户端和服务器之间的流量使用 HTTPS

    【讨论】:

    • 或者更好,因为您使用的是 AWS,请继续使用 Cognito。
    • @molamk 除了文件上传之外,我不会收到任何用户输入。那么我仍然对硬编码的用户名和密码进行哈希和加盐并保存到数据库吗?获取令牌后如何使用它?我需要去盐和哈希吗?
    • 用户名没有,但您肯定需要对它进行哈希处理(并加盐)的密码。也没有“unsalt”,因为您直接比较哈希来验证您的密码。此验证是您生成令牌所需的验证
    • @molamk 即使我创建了用户登录/身份验证,他们的登录也无法与 API 所在的服务器绑定。该服务器只能有一个服务帐户,我们可以使用它来访问 API 令牌和路由,我们不能真正将其提供给用户。所以它必须是用户登录然后他们可以进行 api 调用,因为一旦经过身份验证,“服务帐户”信息将被传递到 API 调用中。将该凭证保存在数据库中并在用户登录后获取它是一种好方法吗?想知道我的选择是什么
    猜你喜欢
    • 1970-01-01
    • 2013-11-23
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多