如何在javascript fetch中存储访问令牌并传递给下一个api调用

Posted

技术标签:

【中文标题】如何在javascript fetch中存储访问令牌并传递给下一个api调用【英文标题】:How to store access token and pass to next api call in javascript fetch 【发布时间】:2021-11-10 01:40:28 【问题描述】:

我只是想知道是否有人可以帮助我解决这个问题。我获取访问令牌的代码是:

    const inputBody = 'client_id=00000000-0000-0000-0000-000000000001&secret=mySecretPassword';
    const headers = 
      'Content-Type':'application/x-www-form-urlencoded',
    ;

    fetch('https://api.replicastudios.com/auth',
    
      method: 'POST',
      body: inputBody,
      headers: headers
    )
     .then(function(res) 
      return res.json();
    ).then(function(body) 
     console.log(body);
    );

然后我需要包含从第一次调用中收到的访问令牌,以便将其插入到下方。

    const headers = 
    'Authorization':'Bearer token'
    ;

    fetch('https://api.replicastudios.com/voice',
    
      method: 'GET',

      headers: headers
        )
    .then(function(res) 
       return res.json();
   ).then(function(body) 
      console.log(body);
    );

保存访问令牌并将其插入第二个请求的最佳方法是什么?

【问题讨论】:

建议正确的标签是fetch-api 谢谢。我编辑了问题并更正了标签。 【参考方案1】:

请,再一次,请不要将用户安全令牌存储在会话存储、本地存储、cookies(您自己,让浏览器为您安全地完成)等中。

浏览器有非常棒的方式来处理那些对安全敏感的东西,并且这些方式可以防止通过 XSS 和其他东西进行会话劫持。

正确的做事方式: 在前端,您调用您的登录(或在您的情况下)身份验证路由,并且从后端而不是在正文中发送您的安全令牌,您需要将其设置在安全 cookie 中。使用 Node+Express 的常见方法之一是这样的:

 res.status(200)
    .cookie('auth_cookie', token,  httpOnly: true, maxAge: 86400 * 1000, sameSite: 'none', secure: true)
    .json( success: true, message );

这是其中的一个例子,你应该在这里了解所有这些参数的作用:https://developer.mozilla.org/en-US/docs/Tools/Storage_Inspector/Cookies

最后,您不需要手动将这些 cookie 包含在其他请求中,如果您使用 Axios,您只需输入 withCredentials: true ,它会自动将这些安全令牌包含在您的 cookie 部分要求。这里已经有一个很好的线程:Make Axios send cookies in its requests automatically

我知道这看起来很有效,但它会确保网络安全(呃)并促进良好做法。

【讨论】:

根据问题的上下文,OP 无法访问后端,因为它是第三方 API,因此他/她无法发送响应 cookie【参考方案2】:

如果您的代码位于看起来像的浏览器中,您可以将访问令牌保存到会话存储中以供将来调用。关闭选项卡时,会话存储将被清除。

    const inputBody = 'client_id=00000000-0000-0000-0000-000000000001&secret=mySecretPassword';
const headers = 
  'Content-Type':'application/x-www-form-urlencoded',
;

fetch('https://api.replicastudios.com/auth',

  method: 'POST',
  body: inputBody,
  headers: headers
)
 .then(function(res) 
  return res.json();
).then(function(body) 
 console.log(body);
 // NEW CODE
 // body.access_token is my guess, you might have to change this
 // based on the response
 window.sessionStorage.setItem('access_token', body.access_token)
);

然后您可以使用以下方式获取访问令牌:

window.sessionStorage.getItem('access_token')

【讨论】:

人们,不要这样做。这是等待发生的安全灾难。 谢谢大家的回答。我对如何正确完成有了更好的了解。谢谢。

以上是关于如何在javascript fetch中存储访问令牌并传递给下一个api调用的主要内容,如果未能解决你的问题,请参考以下文章

如何在 React Redux 中访问存储状态?

如何在fetch then / response函数中访问请求对象

访问函数中的fetch()数据[重复]

如何从 fetch javascript 请求的响应中获取数据

如何使用 fetch 在 javascript 中获取 php 错误消息

提高 Javascript 中多个 FETCH 请求的性能