【问题标题】:How to handle jsonwebtoken from front end如何从前端处理 jsonwebtoken
【发布时间】:2019-09-08 07:14:16
【问题描述】:

我正在开发一个完整的堆栈项目,用户可以在其中创建帐户、访问他们的个人资料、创建博客、阅读他们的博客、删除他们的博客等。为了执行所有这些任务(注册和登录除外),用户拥有进行身份验证。

我已经完成了后端,但我不明白如何将 jsonwebtoken 从客户端发送到服务器端(我知道如何从服务器端发送它)。我知道如何从服务器获取令牌并将它们存储在浏览器的 locaStorage 中,但是当我请求阅读博客或删除博客或在阅读完所有内容后访问我的个人资料时,我不知道如何将它们发送回服务器我的博客。

如果我这样做 -

window.location.href = "/blogs";

那么我将无法发送身份验证令牌,或者我应该说我不知道​​如何使用这种方法发送身份验证令牌。

在堆栈溢出时我读到了这项技术-

window.location.href = "/blogs?token=";

但我认为开发人员不会在他们的项目中使用这种技术,因为据我所知,令牌应该通过标头发送。

如果我总结我的问题,我只想知道如何将身份验证令牌发送到服务器以及更改不同路由的页面,例如显示我所有博客的不同页面和仅显示我的个人资料的另一个页面。如果其他未通过身份验证的人尝试访问个人资料路由或博客路由,则会收到 401 错误。

如果有人能解决我的困惑或向我推荐一本书或一篇文章来解决我的困惑,那将是一个很大的帮助。

【问题讨论】:

  • 你使用 header 发送令牌
  • @muasif80 如果我这样做了,我该如何更改窗口的位置,或者换句话说,我如何更改页面?
  • 如果我理解的很好,您不想使用 JSON Web 令牌作为查询参数吗?就像他们在这里谈论的那样stackoverflow.com/questions/32722952/…
  • @Karlan 不,如果我没有正确解释我的问题,我很抱歉。我想知道的是如何使用另一种方法发送 jsonwebtoken 以便我可以发送令牌以及更改页面(我在发出此请求时当前正在打开)
  • 好的,您不想使用 express 中间件?首先检查用户是否为有效令牌?以这种方式保护路线。

标签: javascript node.js jwt web-development-server


【解决方案1】:

我会尽量简化。例如,我将使用我的一个项目中的代码。

首先,您没有解释如何在服务器端检查和验证令牌。所以为了让解释更完整,我会提供一些代码。

在服务器端,我使用一个简单的函数来检查收到的每个请求,并根据验证和验证过程,在将收到的请求发送到解析器之前更新它。

注意:当前使用的代码是 Express

在我的示例中,我将令牌存储在请求标头 Authorization 字段中。

const isAuth = async (req, res, next) => {
    const authHeader = req.get('Authorization');

    // if is no authorization field in header, we call 
    if (!authHeader) {
        req.isAuth = false;
        return next();
    }
    const token = authHeader.split(' ')[1]; // `Bearer XXXXXXXXXXXXXXXXXXXXX...`

    if (!token) {
      req.isAuth = false;
      return next();
    }
    // Here i decode the token
    const decodedToken = jwt.verify(token, 'SomeSecretWord');

    req.isAuth = true;
    return next();
}

在收到每个请求时,我们检查标头是否包含授权令牌,如果是,我们验证并验证令牌。如果验证成功完成,我会更新请求中的 isAuth 字段并将其设置为 true。

app.use(isAuth);

现在您将能够访问解析器内部的isAuth 并根据其值返回数据(例如:如果为 false,则抛出错误);

所以现在,对于客户端,由于我们希望令牌存储在 headers 的 Authorization 字段中,我们需要在发送请求之前设置它。

确保已将令牌保存在客户端。 就我而言,用户需要登录才能接收新令牌,以便将新创建的令牌存储在客户端存储中。 现在在发送每个请求之前,从存储中访问令牌并使用它更新请求标头。

const headers = {
  Authorization: "Bearer XXXXXXXXXXXXXXXXXXXXXX",
};

const reqInit = {
  method: 'GET',
  headers: headers,
};

// send request using fetch
fetch('/someLocation', reqInit)
  ...

我在这里遇到的问题是在用户会话请求之间存储令牌。

最简单和安全的方法是将其保存在本地或会话缓存中(根据谷歌经过小的研究)并在每次请求时访问它。 在服务器端创建 json Web 令牌时,您可以指定过期时间,因此如果令牌在一段时间内未使用,它将无效,用户需要重新进行身份验证才能接收其他令牌并将其保存在客户端存储中.

经过一番研究,我决定用 graphql (apollo-server /express) 用于服务器端,apollo-client 用于客户端。 由于 apollo-client 提供了一个库来管理客户端的本地缓存,因此它简化了任务。

我希望我已经回答了你的问题,这可以帮助你,如果我犯了错误,请见谅。

【讨论】:

  • 请您解释一下您在提出请求时是如何从客户端添加授权的?因为在这里我可以看到您正在从请求中获取授权令牌。
  • 登录时,我生成一个新令牌并将其发送给客户端。客户端收到带有新生成令牌的响应并将其保存在存储中,以便他可以在当前会话期间访问它。
【解决方案2】:

authorization 标头添加到您的请求中

headers: {
    "authorization": "Bearer your_token"
}

ajax请求添加标头的示例。

【讨论】:

  • 我知道如何将身份验证令牌添加到标头,但我不知道如何使用这种方法更改页面(我当前所在的页面)。假设您在手机上使用 fb,当您按下通知图标或新闻源图标时,您会看到一个不同的页面打开。我想知道如何获得这种行为。
  • 在您的response 上,我告诉您的是,每次您发出请求时首先验证令牌并在该响应成功时调用您的方法,就是这样。它是一个嵌套调用。切换或加载您对该响应的看法
猜你喜欢
  • 1970-01-01
  • 2020-10-23
  • 2018-01-28
  • 2020-11-12
  • 2020-06-10
  • 1970-01-01
  • 2020-01-30
  • 2019-06-03
  • 2017-12-23
相关资源
最近更新 更多