bitbucket-auth-token
Advanced tools
Comparing version
141
index.js
@@ -5,85 +5,88 @@ var homeDir = require('home-dir'); | ||
var RSVP = require('rsvp'); | ||
var _ = require('lodash'); | ||
function getAccessToken(opts) { | ||
// appName, consumerKey, consumerSecret, credentialsResolver, forceCredentials | ||
var appConfigPath = homeDir("/." + opts.appName); | ||
var appConfig; | ||
// appName, consumerKey, consumerSecret, credentialsProvider, forceCredentials | ||
var configPath = homeDir("/." + opts.appName); | ||
var config; | ||
try { | ||
appConfig = jsonfile.readFileSync(appConfigPath); | ||
config = jsonfile.readFileSync(configPath); | ||
} catch (e) { | ||
appConfig = {}; | ||
config = {}; | ||
} | ||
opts = _.extend({}, opts, { | ||
configPath: configPath, | ||
config: config | ||
}); | ||
if (appConfig.refreshToken && !opts.forceCredentials) { | ||
return new RSVP.Promise(function (resolve, reject) { | ||
request | ||
.post('https://bitbucket.org/site/oauth2/access_token') | ||
.auth(opts.consumerKey, opts.consumerSecret) | ||
.accept('application/json') | ||
.type('form') | ||
.send({ | ||
grant_type: 'refresh_token', | ||
refresh_token: appConfig.refreshToken | ||
}) | ||
.end(function (err, res) { | ||
if (res && res.ok) { | ||
jsonfile.writeFileSync(appConfigPath, { | ||
refreshToken: res.body.refresh_token | ||
}, {mode: 0600}); | ||
resolve(res.body.access_token); | ||
} else { | ||
var errorMessage; | ||
if (res && res.status === 401) { | ||
errorMessage = "Authentication failed! Bad refresh token?"; | ||
} else if (err) { | ||
errorMessage = err; | ||
} else { | ||
errorMessage = res.text; | ||
} | ||
reject(errorMessage); | ||
} | ||
}); | ||
if (config.refreshToken && !opts.forceCredentials) { | ||
opts.refreshToken = config.refreshToken; | ||
return getTokens(opts); | ||
} else if (opts.credentialsProvider) { | ||
return opts.credentialsProvider().then(function(credentials) { | ||
opts = _.extend(opts, credentials); | ||
return getTokens(opts); | ||
}); | ||
} else { | ||
throw 'opts must specify a credentialsResolver'; | ||
} | ||
} | ||
function getTokens(opts) { | ||
var payload; | ||
var errorMessageOn401 = 'Authentication failed!'; | ||
if (opts.username) { | ||
payload = { | ||
grant_type: 'password', | ||
username: opts.username, | ||
password: opts.password | ||
}; | ||
errorMessageOn401 += ' Bad username/password?'; | ||
} else if (opts.refreshToken) { | ||
payload = { | ||
grant_type: 'refresh_token', | ||
refresh_token: opts.refreshToken | ||
}; | ||
errorMessageOn401 += ' Bad refresh token?'; | ||
} else { | ||
throw 'opts must specify either username and password, or refreshToken'; | ||
} | ||
return opts.credentialsResolver().then(function(credentials) { | ||
return new RSVP.Promise(function (resolve, reject) { | ||
request | ||
.post('https://bitbucket.org/site/oauth2/access_token') | ||
.auth(opts.consumerKey, opts.consumerSecret) | ||
.accept('application/json') | ||
.type('form') | ||
.send({ | ||
grant_type: 'password', | ||
username: credentials.username, | ||
password: credentials.password | ||
}) | ||
.end(function (err, res) { | ||
if (res && res.ok) { | ||
jsonfile.writeFileSync(appConfigPath, { | ||
refreshToken: res.body.refresh_token | ||
}, {mode: 0600}); | ||
resolve(res.body.access_token); | ||
} else { | ||
var errorMessage; | ||
if (res && res.status === 401) { | ||
errorMessage = "Authentication failed! Bad username/password?"; | ||
} else if (err) { | ||
errorMessage = err; | ||
} else { | ||
errorMessage = res.text; | ||
} | ||
reject(errorMessage); | ||
return new RSVP.Promise(function (resolve, reject) { | ||
request | ||
.post('https://bitbucket.org/site/oauth2/access_token') | ||
.auth(opts.consumerKey, opts.consumerSecret) | ||
.accept('application/json') | ||
.type('form') | ||
.send(payload) | ||
.end(function (err, res) { | ||
if (res && res.ok) { | ||
var newConfig = _.extend(opts.config, { | ||
refreshToken: res.body.refresh_token | ||
}); | ||
jsonfile.writeFile(opts.configPath, newConfig, { | ||
mode: 0600 | ||
}, function() { | ||
// log a message if we're using the password flow to retrieve a token | ||
if (opts.username) { | ||
opts.logger('storing auth token in ' + opts.configPath); | ||
} | ||
}); | ||
resolve(res.body.access_token); | ||
} else { | ||
var errorMessage; | ||
if (res && res.status === 401) { | ||
errorMessage = errorMessageOn401; | ||
} else if (err) { | ||
errorMessage = err; | ||
} else { | ||
errorMessage = res.text; | ||
} | ||
reject(errorMessage); | ||
} | ||
}); | ||
}); | ||
} | ||
}); | ||
} | ||
@@ -90,0 +93,0 @@ |
{ | ||
"name": "bitbucket-auth-token", | ||
"version": "0.0.2", | ||
"version": "0.0.3", | ||
"description": "Maintain a local cache of Bitbucket OAuth tokens for use with the Bitbucket REST API.", | ||
@@ -22,2 +22,3 @@ "main": "index.js", | ||
"jsonfile": "^2.2.3", | ||
"lodash": "^3.10.1", | ||
"rsvp": "^3.1.0", | ||
@@ -24,0 +25,0 @@ "superagent": "^1.4.0" |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
27645
5.51%14
16.67%87
7.41%5
25%+ Added
+ Added