function(response, body) {
   try {
     var data = JSON.parse(body)
   } catch (e) {
     return callback(errors.external('GitHubError: GitHub responded with an unexpected format'))
   }
   var message = data.message
   var identifier = data.id
   errors
     .with(callback)
     .when(message)
       .external('GitHubError: GitHub says: `%s`', message)
     .when(!identifier)
       .external('GitHubError: GitHub responded with an unexpected response')
     .success(function() {
       var args = {
         provider: 'gh',
         identifier: identifier,
         extra: {
           id: identifier,
           name: data.name,
           login: data.login,
         },
       }
       return callback(null, args)
     })
 }
 function(response, body) {
   try {
     var data = JSON.parse(body)
   } catch(e) {
     return callback(errors.external('GooglePlusError: Google Plus responded with an unexpected format'))
   }
   if (data.error) {
     // Example error response
     // {
     //   "error": {
     //     "errors": [
     //       {
     //         "domain": "usageLimits",
     //         "reason": "accessNotConfigured",
     //         "message": "Access Not Configured"
     //       }
     //     ],
     //     "code": 403,
     //     "message": "Access Not Configured"
     //   }
     // }
     var message = data.error.message
     var code = data.error.code
     if (message && code) {
       message += ' (code: '+code+')'
     }
     if (message) {
       return callback(errors.external('GooglePlusError: Google said `%s`', message))
     } else {
       return callback(errors.external('GooglePlusError: Google Plus responded with an unknown error'))
     }
   }
   if (!data.id) {
     return callback(errors.external('GooglePlusError: Google Plus responded with an unexpected response'))
   }
   var args = {
     identifier: data.id,
     extra: {
       id: data.id,
       name: data.displayName,
       image: data.image && data.image.url,
     },
   }
   return callback(null, args)
 }