安全地将不记名令牌从服务器专用 cookie 传递到 header

Safely passing bearer tokens to the header from a server only cookie

有没有办法 "safely" 将不记名令牌存储在 cookie 中(来自 Express 服务器 运行 一个 Next.js 应用程序的服务器端),然后将其作为 Next.js 的一部分提供=19=] 以便它包含在每个 Apollo 请求中? Apollo 团队有一个使用 localStorage 的示例,但是没有关于从 cookie 中获取它与 localStorage 以在 header 中设置的区别。我正在研究这个以减轻 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 服务器,它期待从 header 以授权形式发送的不记名令牌:'Bearer ****'。我只是在寻找最安全的方法来做到这一点,感觉我从大多数教程中得到的信息相互矛盾。

将我的评论作为答案,因为它可以帮助您解决问题:

浏览器 Javascript 根本无法访问仅限服务器的 cookie。因此,如果服务器将令牌放入仅供服务器使用的 cookie 中,那么您将无法从浏览器 Javascript 访问它。服务器可以将其设为常规 cookie,然后您可以从浏览器 Javascript 访问它。或者,如果客户端实际上不在浏览器中,它可以获得 cookie。

Is there a way to safely provide a token to this code without exposing the token in the browser?.

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

What I'm asking is. Is there a way to attach the token cookie via node.js so that it gets attached to all Apollo requests without adding it via the client.

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