Abstruct

Cookie情報を、BFF(Backend for Frontend)で受け取って、Backend側へ送信するサンプルコードを載せておきます。

Request → (cookie) → BFF → (cookie) → Backend

1. Sample Code

1.1. Request

curl-b オプションでCookieを送れるので、今回はこちらを利用しました。

1
curl -v --request POST -H 'Content-Type: application/json' -b 'name=taro; age=20' -d '{ "query": [GraphQLの命令] "}' http://localhost:4000/graphql
1
curl -v --request POST -H 'Content-Type: application/json' -b 'name=taro; age=20' -d '{ "query": "query { sample(id: \"001\") {result}}" }' http://localhost:4000/graphql

1.2. BFF

ApolloServer のプラグインの中で、Cookieを受け取って、Backendへ通信するHTTP Client(axios) に Cookie情報をセットします。

1
2
3
4
5
6
  const server = new ApolloServer({
    ()
    plugins: [
      setCookieToHttpClientPlugin
    ],
  })
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
export const setCookieToHttpClientPlugin: ApolloServerPlugin  = {
  async requestDidStart(_requestContext) {
    return {
      async parsingDidStart(requestContext) {
        axios.interceptors.request.use(
          (config: AxiosRequestConfig<object>): AxiosRequestConfig<object> => {
            const cookie = requestContext.request.http?.headers.get("cookie")
            if(cookie != null && config.headers != null){
              config.headers.cookie =  cookie;
            }
            return config
          }
        )
      },
    }
  }
}

1.3. Backend

  • 使用するライブラリ

    1
    
    $ yarn add @types/cookie-parser cookie-parser
    
  • expressへの設定

    1
    2
    3
    
    const app = express()
    app.use(cookieParser())
    app.use(router)
    
  • Cookieの取得方法

    1
    2
    3
    4
    
    router.post('/sample', async (req, res, next) => {
      // Cookie が受け取れていることの確認
      console.log(req.cookies)
    }
    

2. Reference