代码之家  ›  专栏  ›  技术社区  ›  Shawn Matthews

从仅服务器cookie安全地将承载令牌传递到头

  •  0
  • Shawn Matthews  · 技术社区  · 6 年前

    有没有办法“安全地”将承载令牌存储在cookies(运行Next.js应用程序的Express服务器的服务器端)中,然后将其作为头的一部分提供,以便它包含在每个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服务器,它期望从报头以授权的形式发送一个承载令牌:“承载****”。我只是在寻找最安全的方法来做到这一点,我觉得我从大多数教程中得到的信息相互矛盾。

    1 回复  |  直到 6 年前
        1
  •  1
  •   jfriend00    6 年前

    把我的评论变成一个答案,因为它能帮你解决问题:

    浏览器Javascript根本无法访问仅限服务器的cookie。因此,如果服务器将令牌放在仅服务器的cookie中,则无法从浏览器Javascript访问该令牌。服务器可以让它只是一个普通的cookie,然后您可以从浏览器Javascript获取它。或者,如果客户端实际上不在浏览器中,它可能会得到cookie。

    有没有办法在浏览器中不公开令牌的情况下安全地向此代码提供令牌?.

    如果此代码在浏览器中(看起来是因为它正在访问本地存储),则“否”,无法让此代码访问令牌,但不能让浏览器中的其他代码访问令牌。使用浏览器Javascript访问的任何内容都是可以访问的。通常,通过让服务器跟踪身份验证令牌并让服务器代表客户端访问特权服务器并将结果发送给客户端来维护安全性。

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

    Apollo请求是直接从客户机发出的还是只从服务器发出的?对不起,我不明白你的建筑风格。如果仅从服务器,则可以在服务器上创建客户端会话(请参见快速会话),并且可以将属于特定客户端的内容存储在该会话中的服务器上,然后可以在以后的请求中检索这些内容。