facebook-workplaceoutlookemailmicrosoft-teamsdiscordmessengercustom-servicesmacoslinuxwindowsinboxwhatsappicloudtweetdeckhipchattelegramhangoutsslackgmailskype
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.5 KiB
151 lines
4.5 KiB
// Credits: github.com/adeperio and github.com/uotw |
|
'use strict'; |
|
|
|
Object.defineProperty(exports, "__esModule", { |
|
value: true |
|
}); |
|
|
|
var _createClass = function() { |
|
function defineProperties(target, props) { |
|
for (var i = 0; i < props.length; i++) { |
|
var descriptor = props[i]; |
|
descriptor.enumerable = descriptor.enumerable || false; |
|
descriptor.configurable = true; |
|
if ("value" in descriptor) descriptor.writable = true; |
|
Object.defineProperty(target, descriptor.key, descriptor); |
|
} |
|
} |
|
return function(Constructor, protoProps, staticProps) { |
|
if (protoProps) defineProperties(Constructor.prototype, protoProps); |
|
if (staticProps) defineProperties(Constructor, staticProps); |
|
return Constructor; |
|
}; |
|
}(); |
|
|
|
var _request = require('request'); |
|
|
|
var _request2 = _interopRequireDefault(_request); |
|
|
|
var _crypto = require('crypto'); |
|
|
|
var _crypto2 = _interopRequireDefault(_crypto); |
|
|
|
var _requestPromise = require('request-promise'); |
|
|
|
var _requestPromise2 = _interopRequireDefault(_requestPromise); |
|
|
|
function _interopRequireDefault(obj) { |
|
return obj && obj.__esModule ? obj : { |
|
default: obj |
|
}; |
|
} |
|
|
|
function _classCallCheck(instance, Constructor) { |
|
if (!(instance instanceof Constructor)) { |
|
throw new TypeError("Cannot call a class as a function"); |
|
} |
|
} |
|
|
|
//https://auth0.com/docs/api-auth/tutorials/authorization-code-grant-pkce |
|
var AuthService = function() { |
|
function AuthService(config) { |
|
_classCallCheck(this, AuthService); |
|
|
|
this.config = config; |
|
} |
|
|
|
_createClass(AuthService, [{ |
|
key: 'requestAuthCode', |
|
value: function requestAuthCode() { |
|
this.challengePair = AuthService.getPKCEChallengePair(); |
|
return this.getAuthoriseUrl(this.challengePair); |
|
} |
|
}, { |
|
key: 'requestAccessCode', |
|
value: function requestAccessCode(callbackUrl, onSuccess, authWindow) { |
|
var _this = this; |
|
|
|
return new Promise(function(resolve, reject) { |
|
|
|
if (_this.isValidAccessCodeCallBackUrl(callbackUrl)) { |
|
|
|
var authCode = AuthService.getParameterByName('code', callbackUrl); |
|
|
|
if (authCode != null) { |
|
var _verifier = _this.challengePair.verifier; |
|
var options = _this.getTokenPostRequest(authCode, _verifier); |
|
|
|
return (0, _requestPromise2.default)(options).then(function(response) { |
|
onSuccess(JSON.parse(response), authWindow); |
|
}).catch(function(err) { |
|
if (err) throw new Error(err); |
|
}); |
|
} else { |
|
reject('Could not parse the authorization code'); |
|
} |
|
} else { |
|
//reject('Access code callback url not expected.'); |
|
} |
|
}); |
|
} |
|
}, { |
|
key: 'getAuthoriseUrl', |
|
value: function getAuthoriseUrl(challengePair) { |
|
return this.config.authorizeEndpoint + '?scope=' + this.config.scope + '&response_type=code&client_id=' + this.config.clientId + '&code_challenge=' + challengePair.challenge + '&code_challenge_method=S256&redirect_uri=' + this.config.redirectUri; |
|
} |
|
}, { |
|
key: 'getTokenPostRequest', |
|
value: function getTokenPostRequest(authCode, verifier) { |
|
return { |
|
method: 'POST', |
|
url: this.config.tokenEndpoint, |
|
headers: { |
|
'content-type': 'application/json' |
|
}, |
|
body: '{"grant_type":"authorization_code",\n "client_id": "' + this.config.clientId + '",\n "code_verifier": "' + verifier + '",\n "code": "' + authCode + '",\n "redirect_uri":"' + this.config.redirectUri + '"\n }' |
|
}; |
|
} |
|
}, { |
|
key: 'isValidAccessCodeCallBackUrl', |
|
value: function isValidAccessCodeCallBackUrl(callbackUrl) { |
|
//console.log(this.config.redirectUri); |
|
return callbackUrl.indexOf(this.config.redirectUri) > -1; |
|
} |
|
}], [{ |
|
key: 'getPKCEChallengePair', |
|
value: function getPKCEChallengePair() { |
|
var verifier = AuthService.base64URLEncode(_crypto2.default.randomBytes(32)); |
|
var challenge = AuthService.base64URLEncode(AuthService.sha256(verifier)); |
|
return { |
|
verifier: verifier, |
|
challenge: challenge |
|
}; |
|
} |
|
}, { |
|
key: 'getParameterByName', |
|
value: function getParameterByName(name, url) { |
|
|
|
name = name.replace(/[\[\]]/g, "\\$&"); |
|
var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"), |
|
results = regex.exec(url); |
|
if (!results) return null; |
|
if (!results[2]) return ''; |
|
return decodeURIComponent(results[2].replace(/\+/g, " ")); |
|
} |
|
}, { |
|
key: 'base64URLEncode', |
|
value: function base64URLEncode(str) { |
|
|
|
return str.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=/g, ''); |
|
} |
|
}, { |
|
key: 'sha256', |
|
value: function sha256(buffer) { |
|
return _crypto2.default.createHash('sha256').update(buffer).digest(); |
|
} |
|
}]); |
|
|
|
return AuthService; |
|
}(); |
|
|
|
exports.default = AuthService;
|
|
|