簡體   English   中英

如何對graphql解析器實施防護

[英]How a guard can be implemented to a graphql resolver

我是graphql的新手,正在嘗試將身份驗證/授權系統集成到我的項目中。 我在Medium上找到了一個示例,但是我不了解警衛如何與解析器進行通信。 如果有人知道,我將不勝感激。

import { ApolloServer } from 'apollo-server';
import gql from 'graphql-tag';
import { tradeTokenForUser } from './auth-helpers';

const HEADER_NAME = 'authorization';

const typeDefs = gql`
  type Query {
     me: User
     serverTime: String
  }
  type User {
     id: ID!
     username: String!
  }
`;

const resolvers = {
   Query: {
      me: authenticated((root, args, context) => context.currentUser), 
      serverTime: () => new Date(),
   },
   User: {
      id: user => user._id,
      username: user => user.username,
   },
};

const server = new ApolloServer({
   typeDefs,
   resolvers,
   context: async ({ req }) => {
      let authToken = null;
      let currentUser = null;

       try {
          authToken = req.headers[HEADER_NAME];

          if (authToken) {
               currentUser = await tradeTokenForUser(authToken);
          }
       } catch (e) {
          console.warn(`Unable to authenticate using auth token: ${authToken}`);
       }

      return {
          authToken,
          currentUser,
      };
   },
});

server.listen().then(({ url }) => {
  console.log(`🚀  Server ready at ${url}`);
});
export const authenticated = next => (root, args, context, info) => {
  if (!context.currentUser) {
      throw new Error(`Unauthenticated!`);
  }

  return next(root, args, context, info);
};

我不明白“下一個”參數的作用,為什么當調用此防護措施時作為參數必須返回一個值?

authenticated是使代碼DRY的高階函數。 next是用作謂語的回調。

這是DRYer的寫法:

...
me: (root, args, context) => {
  if (!context.currentUser) {
      throw new Error(`Unauthenticated!`);
  }

  return context.currentUser;
)
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM