【问题标题】:MERN-stack with react-router user authentication without redux带有 react-router 用户身份验证的 MERN 堆栈,没有 redux
【发布时间】:2018-08-08 01:08:00
【问题描述】:

我目前正在尝试为我的应用程序实施一些身份验证,但是,我有一个简单的问题。 我在后端设置了一些基本身份验证,它设置了一个令牌并将其发送到前端并保存在一个 cookie 中。 我读到令牌在我进行 api 调用的任何时候都会发送到服务器,但我无法理解我应该如何做到这一点。

我刚刚阅读了这个question on stackoverflow,似乎回答这个问题的人只是建议了两个帮助函数来检查是否有一个名为令牌的项目。 这对我来说似乎有点安全风险。难道任何人都不能在本地存储中设置一个名为 token 的项目吗?因此,此人将获得对受保护路线的访问权? 如果是这样,您将如何确保 JWT 实际经过身份验证?

所以,分解一下,我的问题是:

  1. 以上答案是否表明存在安全风险?
  2. 您如何通过 api 调用发送 JWT 以及如何验证它们?

【问题讨论】:

    标签: node.js reactjs authentication react-router


    【解决方案1】:
    1. 以上答案是否表明存在安全风险?

    如果使用随机令牌,您的 api 应该返回 401 错误,因此您可以通过清除 cookie/本地存储中的令牌值来处理此 401 错误。

    编辑:为了防止用户使用自己输入的令牌值访问私有路由,您可能需要发出 api 请求以检查私有路由的 auth 函数中的令牌(这是可选的作为假用户无论如何都无法获取 api,顺便说一句,请记住,客户端可以访问 javascript 应用程序代码,因此他将始终能够“读取”受限页面,除非您执行 SSR,这就是您的原因敏感数据必须在服务器端)

    1. 您如何通过 api 调用发送 JWT 以及如何验证它们?

    取决于您的服务器端实现,即 jsonwebtokenpassportpassport-jwt 效果很好。

    在客户端,您将在每个请求的 Authorization 标头中发送您的 jwt,并带有 JWTBearer 之类的前缀(取决于护照配置)。

    使用 fetch 的示例:

    fetch('/api', {
        headers: {
            'Authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ...'
        }
    });
    

    【讨论】:

    • 非常感谢您的回复。我的应用程序中有几条路线,其中一些受到保护。所以,你说如果我检查令牌是否存在就足够了,当我进行 api 调用以检索用户数据时,我只需将令牌作为标头传递。后端如何验证令牌?我在后端设置身份验证时遵循了本教程medium.com/of-all-things-tech-progress/…
    • 你链接的教程使用 session 来验证用户,所以你不会在这里找到如何使用 jwt 令牌,你可以看看这个教程:scotch.io/tutorials/…
    • 我只创建一个令牌,而不是会话,服务器发送该令牌作为响应。非常感谢您的链接!
    • 希望这不会太远,但是您知道我如何也可以获取特定于用户的数据吗?我的令牌存储用户信息,但我如何使用它来获取有关该特定用户的实际信息?
    • 您可以使用中间件来解码 JWT(我发给您的教程中的第 9 节,它将解码后的用户信息设置在 req.decoded
    猜你喜欢
    • 1970-01-01
    • 2021-08-11
    • 2017-08-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2020-08-02
    • 2019-08-24
    • 1970-01-01
    相关资源
    最近更新 更多