【问题标题】:Safely passing bearer tokens to the header from a server only cookie将不记名令牌从仅服务器 cookie 安全地传递到标头
【发布时间】:2019-01-13 00:14:02
【问题描述】:

有没有办法“安全地”将不记名令牌存储在 cookie 中(来自运行 Next.js 应用程序的 Express 服务器的服务器端),然后将其作为标头的一部分提供,以便包含在每个 Apollo 请求中? Apollo 团队有一个使用 localStorage 的示例,但没有任何关于从 cookie 和 localStorage 中获取它以设置在标题中的内容。我正在研究这个以减轻 XSS。有没有办法安全地为此代码提供令牌而不在浏览器中暴露令牌?这似乎已在多个教程的部分内容中进行了介绍,但我似乎无法根据此示例找到任何确定的代码。

import { ApolloClient } from 'apollo-client';
import { createHttpLink } from 'apollo-link-http';
import { setContext } from 'apollo-link-context';
import { InMemoryCache } from 'apollo-cache-inmemory';

const httpLink = createHttpLink({
  uri: '/graphql',
});

const authLink = setContext((_, { headers }) => {
  // get the authentication token from local storage if it exists
  const token = localStorage.getItem('token');
  // return the headers to the context so httpLink can read them
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : "",
    }
  }
});

const client = new ApolloClient({
  link: authLink.concat(httpLink),
  cache: new InMemoryCache()
});

我有一个 Oauth2 服务器,它期望从标头以授权形式发送一个不记名令牌:“不记名 ****”。我只是在寻找最安全的方法来做到这一点,并且感觉我从大多数教程中得到了相互矛盾的信息。

【问题讨论】:

  • 浏览器 Javascript 根本无法访问服务器专用 cookie。因此,如果服务器将令牌放入仅限服务器的 cookie 中,则您无法从浏览器 Javascript 访问它。服务器可以把它变成一个普通的 cookie,然后你可以从浏览器 Javascript 中获取它。或者,如果客户端实际上不在浏览器中,它可以获取 cookie。
  • 有没有一种方法可以安全地向此代码提供令牌,而无需在浏览器中暴露令牌?。如果这段代码在浏览器中(看起来是因为它正在访问localStorage),那么“不”,没有办法让这段代码访问令牌,但不能让浏览器中的其他代码拥有访问它。您使用浏览器 Javascript 访问的任何内容都可供全世界访问。通常,您通过让您的服务器跟踪身份验证令牌并让您的服务器代表客户端访问特权服务器并将结果发送给客户端来维护安全性。
  • 感谢@jfriend00 的评论。那是我的理解。一旦客户拥有它。它和公众知识一样好。基本上我要问的是。有没有办法让我的应用程序服务器使用这个令牌附加一个标头,而不会一直到客户端。所以 express(客户端服务器)向需要身份验证的服务器发出请求。它传回一个令牌。快递服务器比持有它并将其附加到所有通过它的流量作为标头的一部分。
  • 我不明白您的评论部分:“快递服务器比持有它并将其作为标头的一部分附加到通过它的所有流量”?快速服务器当然可以保留令牌(这可能是所需的设计),并且它可以使用该令牌代表特定客户端向其他服务器发出请求,仅向客户端发送结果(从不发送令牌)。不过,我不知道您评论中的“通过它”部分是什么意思。
  • 抱歉耽搁了。我要问的是。有没有办法通过 node.js 附加令牌 cookie,以便它附加到所有 Apollo 请求而不通过客户端添加它。

标签: express cookies oauth apollo next.js


【解决方案1】:

将我的 cmets 变成一个答案,因为它可以帮助您解决问题:

浏览器 Javascript 根本无法访问服务器专用 cookie。因此,如果服务器将令牌放入仅限服务器的 cookie 中,则您无法从浏览器 Javascript 访问它。服务器可以把它变成一个普通的 cookie,然后你可以从浏览器 Javascript 中获取它。或者,如果客户端实际上不在浏览器中,它可以获取 cookie。

有没有办法安全地向此代码提供令牌而不在浏览器中暴露令牌?

如果这段代码在浏览器中(看起来是因为它正在访问localStorage),那么“否”,没有办法让这段代码访问令牌,但不允许浏览器中的其他代码可以访问它。您使用浏览器 Javascript 访问的任何内容都可供全世界访问。通常,您通过让服务器跟踪身份验证令牌并让您的服务器代表客户端访问特权服务器并将结果发送给客户端来维护安全性。

我要问的是。有没有办法通过 node.js 附加令牌 cookie,以便它附加到所有 Apollo 请求而不通过客户端添加它。

Apollo 请求是直接从客户端发出还是仅从您的服务器发出?对不起,但我不明白你的架构。如果仅来自服务器,那么您可以在服务器上创建一个客户端会话(请参阅 express-session),您可以在该会话中将属于特定客户端的内容存储在服务器上,然后您可以在将来的请求中检索这些内容。

【讨论】:

    猜你喜欢
    • 2014-12-03
    • 2018-03-15
    • 2012-06-30
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多