118 lines
3.3 KiB
JavaScript
118 lines
3.3 KiB
JavaScript
var errors = require('./errors'),
|
|
url = require('url');
|
|
|
|
function buildAuthorizationUri(context, expiresIn, code, token) {
|
|
var redirect = url.parse(context.redirect_uri, true);
|
|
|
|
delete redirect.search;
|
|
|
|
if (context.scope) {
|
|
redirect.query.scope = context.scope.join(',');
|
|
}
|
|
|
|
if (context.state) {
|
|
redirect.query.state = context.state;
|
|
}
|
|
|
|
if (expiresIn) {
|
|
redirect.query.expires_in = expiresIn;
|
|
}
|
|
|
|
if (code) {
|
|
redirect.query.code = code;
|
|
}
|
|
|
|
if (token) {
|
|
redirect.query.access_token = token;
|
|
redirect.query.token_type = 'Bearer';
|
|
}
|
|
|
|
return url.format(redirect);
|
|
}
|
|
|
|
function authorizeRequestWithClient(authServer, client, context, accountId, callback) {
|
|
if (!client) {
|
|
return callback(errors.invalidClient(context));
|
|
}
|
|
|
|
if (!context.redirect_uri || !authServer.clientService.isValidRedirectUri(client, context.redirect_uri)) {
|
|
return callback(errors.redirectUriMismatch(context));
|
|
}
|
|
|
|
function finalResponse(error, data) {
|
|
if(error){
|
|
return callback(error);
|
|
}
|
|
|
|
callback(
|
|
null,
|
|
{
|
|
redirectUri: buildAuthorizationUri(context, authServer.expiresIn, data.code, data.access_token),
|
|
state: context
|
|
}
|
|
);
|
|
}
|
|
|
|
if (context.response_type === 'code') {
|
|
authServer.tokenService.generateAuthorizationCode(function(error, code){
|
|
if(error){
|
|
return callback(error);
|
|
}
|
|
|
|
authServer.authorizationService.saveAuthorizationCode({
|
|
code: code,
|
|
redirectUri: context.redirect_uri,
|
|
clientId: client.id,
|
|
expiresDate: authServer.getExpiresDate(),
|
|
accountId: accountId
|
|
}, finalResponse);
|
|
|
|
});
|
|
return;
|
|
}
|
|
|
|
if (context.response_type === 'token') {
|
|
authServer.tokenService.generateToken(function(error, token){
|
|
if(error){
|
|
return callback(error);
|
|
}
|
|
|
|
authServer.authorizationService.saveAccessToken({
|
|
clientId: client.id,
|
|
access_token: token,
|
|
expires_in: authServer.getExpiresDate(),
|
|
accountId: accountId,
|
|
token_type: 'Bearer'
|
|
}, finalResponse);
|
|
});
|
|
return;
|
|
}
|
|
|
|
callback(errors.invalidResponseType(context.state));
|
|
}
|
|
|
|
function authorizeRequest(context, accountId, callback) {
|
|
var authServer = this;
|
|
|
|
if (!context || !context.response_type) {
|
|
return callback(errors.invalidRequest(context));
|
|
}
|
|
|
|
if (context.response_type !== 'token' && context.response_type !== 'code') {
|
|
return callback(errors.unsupportedResponseType(context));
|
|
}
|
|
|
|
if (!authServer.isSupportedScope(context.scope)) {
|
|
return callback(errors.invalidScope(context));
|
|
}
|
|
|
|
authServer.clientService.getById(context.client_id, function(error, client){
|
|
if(error){
|
|
return callback(error);
|
|
}
|
|
|
|
authorizeRequestWithClient(authServer, client, context, accountId, callback);
|
|
});
|
|
}
|
|
|
|
module.exports = authorizeRequest; |