62 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			62 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								module.exports = authenticationBeforeRequest
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const btoa = require('btoa-lite')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								const withAuthorizationPrefix = require('./with-authorization-prefix')
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								function authenticationBeforeRequest (state, options) {
							 | 
						||
| 
								 | 
							
								  if (typeof state.auth === 'string') {
							 | 
						||
| 
								 | 
							
								    options.headers['authorization'] = withAuthorizationPrefix(state.auth)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // https://developer.github.com/v3/previews/#integrations
							 | 
						||
| 
								 | 
							
								    if (/^bearer /i.test(state.auth) && !/machine-man/.test(options.headers['accept'])) {
							 | 
						||
| 
								 | 
							
								      const acceptHeaders = options.headers['accept'].split(',')
							 | 
						||
| 
								 | 
							
								        .concat('application/vnd.github.machine-man-preview+json')
							 | 
						||
| 
								 | 
							
								      options.headers['accept'] = acceptHeaders.filter(Boolean).join(',')
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (state.auth.username) {
							 | 
						||
| 
								 | 
							
								    const hash = btoa(`${state.auth.username}:${state.auth.password}`)
							 | 
						||
| 
								 | 
							
								    options.headers['authorization'] = `Basic ${hash}`
							 | 
						||
| 
								 | 
							
								    if (state.otp) {
							 | 
						||
| 
								 | 
							
								      options.headers['x-github-otp'] = state.otp
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (state.auth.clientId) {
							 | 
						||
| 
								 | 
							
								    // There is a special case for OAuth applications, when `clientId` and `clientSecret` is passed as
							 | 
						||
| 
								 | 
							
								    // Basic Authorization instead of query parameters. The only routes where that applies share the same
							 | 
						||
| 
								 | 
							
								    // URL though: `/applications/:client_id/tokens/:access_token`.
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    //  1. [Check an authorization](https://developer.github.com/v3/oauth_authorizations/#check-an-authorization)
							 | 
						||
| 
								 | 
							
								    //  2. [Reset an authorization](https://developer.github.com/v3/oauth_authorizations/#reset-an-authorization)
							 | 
						||
| 
								 | 
							
								    //  3. [Revoke an authorization for an application](https://developer.github.com/v3/oauth_authorizations/#revoke-an-authorization-for-an-application)
							 | 
						||
| 
								 | 
							
								    //
							 | 
						||
| 
								 | 
							
								    // We identify by checking the URL. It must merge both "/applications/:client_id/tokens/:access_token"
							 | 
						||
| 
								 | 
							
								    // as well as "/applications/123/tokens/token456"
							 | 
						||
| 
								 | 
							
								    if (/\/applications\/:?[\w_]+\/tokens\/:?[\w_]+($|\?)/.test(options.url)) {
							 | 
						||
| 
								 | 
							
								      const hash = btoa(`${state.auth.clientId}:${state.auth.clientSecret}`)
							 | 
						||
| 
								 | 
							
								      options.headers['authorization'] = `Basic ${hash}`
							 | 
						||
| 
								 | 
							
								      return
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    options.url += options.url.indexOf('?') === -1 ? '?' : '&'
							 | 
						||
| 
								 | 
							
								    options.url += `client_id=${state.auth.clientId}&client_secret=${state.auth.clientSecret}`
							 | 
						||
| 
								 | 
							
								    return
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return Promise.resolve()
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    .then(() => {
							 | 
						||
| 
								 | 
							
								      return state.auth()
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    .then((authorization) => {
							 | 
						||
| 
								 | 
							
								      options.headers['authorization'] = withAuthorizationPrefix(authorization)
							 | 
						||
| 
								 | 
							
								    })
							 | 
						||
| 
								 | 
							
								}
							 |