Last active
          February 6, 2018 21:57 
        
      - 
      
- 
        Save southpolesteve/e190e9572d060b515836666610b858a9 to your computer and use it in GitHub Desktop. 
    graphQL schema auth
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | // Search every field and swap out the resolvers if an `authorize` key is present | |
| export function authorize (schema) { | |
| // We require auth for all mutations | |
| const mutations = (schema._mutationType && Object.keys(schema._mutationType._fields)) || [] | |
| mutations.forEach(mutationName => { | |
| const field = schema._mutationType._fields[mutationName] | |
| invariant(field.authorize, `Mutation: "${mutationName}" must have an "authorize" property. Use "*" for no auth`) | |
| }) | |
| // Walk the type map and all the fields and wrap resolvers in an auth check | |
| Object.keys(schema._typeMap).forEach((typName) => { | |
| const typ = schema._typeMap[typName] | |
| if (!typ._fields) { | |
| return | |
| } | |
| Object.keys(typ._fields).forEach((fieldName) => { | |
| const field = typ._fields[fieldName] | |
| if (field.authorize) { | |
| typ._fields[fieldName] = wrapResolver(field) | |
| } | |
| }) | |
| }) | |
| return schema | |
| } | |
| function wrapResolver (field) { | |
| const { | |
| resolve: oldResolver = defaultFieldResolver, | |
| authorize: fieldAuthorize, | |
| description: oldDescription | |
| } = field | |
| const resolve = async function (root, args, { auth }, info) { | |
| await auth.checkAuthorization(fieldAuthorize, ...arguments) | |
| return oldResolver(...arguments) | |
| } | |
| const description = oldDescription || 'This field requires authorization.' | |
| return { ...field, resolve, description, authorize, isAuthorized: true } | |
| } | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | export const User = new GraphQLObjectType({ | |
| name: 'User', | |
| fields: () => { | |
| return { | |
| name: { | |
| authorize: 'admin' // Accepts a string. Checks if the current user in admin | |
| type: GraphQLString | |
| }, | |
| email: { | |
| authorize: currentUser => { return false } // Also accepts a custom function that can do more complicated things | |
| type: GraphQLString | |
| } | |
| } | |
| } | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment