179 lines
6.0 KiB
JavaScript
179 lines
6.0 KiB
JavaScript
'use strict';
|
|
|
|
/* global redirect_uri:true */
|
|
/* global clientId */
|
|
/* global scopeSeparator */
|
|
/* global additionalQueryStringParams */
|
|
/* global clientSecret */
|
|
/* global onOAuthComplete */
|
|
/* global realm */
|
|
/*jshint unused:false*/
|
|
|
|
SwaggerUi.Views.AuthView = Backbone.View.extend({
|
|
events: {
|
|
'click .auth_submit__button': 'authorizeClick',
|
|
'click .auth_logout__button': 'logoutClick'
|
|
},
|
|
|
|
tpls: {
|
|
main: Handlebars.templates.auth_view
|
|
},
|
|
|
|
selectors: {
|
|
innerEl: '.auth_inner',
|
|
authBtn: '.auth_submit__button'
|
|
},
|
|
|
|
initialize: function(opts) {
|
|
this.options = opts || {};
|
|
opts.data = opts.data || {};
|
|
this.router = this.options.router;
|
|
|
|
this.authsCollectionView = new SwaggerUi.Views.AuthsCollectionView({data: opts.data});
|
|
|
|
this.$el.html(this.tpls.main({
|
|
isLogout: this.authsCollectionView.collection.isAuthorized(),
|
|
isAuthorized: this.authsCollectionView.collection.isPartiallyAuthorized()
|
|
}));
|
|
this.$innerEl = this.$(this.selectors.innerEl);
|
|
this.isLogout = this.authsCollectionView.collection.isPartiallyAuthorized();
|
|
},
|
|
|
|
render: function () {
|
|
this.$innerEl.html(this.authsCollectionView.render().el);
|
|
|
|
return this;
|
|
},
|
|
|
|
authorizeClick: function (e) {
|
|
e.preventDefault();
|
|
e.stopPropagation();
|
|
|
|
if (this.authsCollectionView.collection.isValid()) {
|
|
this.authorize();
|
|
} else {
|
|
this.authsCollectionView.highlightInvalid();
|
|
}
|
|
},
|
|
|
|
authorize: function () {
|
|
this.authsCollectionView.collection.forEach(function (auth) {
|
|
var keyAuth, basicAuth;
|
|
var type = auth.get('type');
|
|
|
|
if (type === 'apiKey') {
|
|
keyAuth = new SwaggerClient.ApiKeyAuthorization(
|
|
auth.get('name'),
|
|
auth.get('value'),
|
|
auth.get('in')
|
|
);
|
|
|
|
this.router.api.clientAuthorizations.add(auth.get('title'), keyAuth);
|
|
} else if (type === 'basic') {
|
|
basicAuth = new SwaggerClient.PasswordAuthorization(auth.get('username'), auth.get('password'));
|
|
this.router.api.clientAuthorizations.add(auth.get('title'), basicAuth);
|
|
} else if (type === 'oauth2') {
|
|
this.handleOauth2Login(auth);
|
|
}
|
|
}, this);
|
|
|
|
this.router.load();
|
|
},
|
|
|
|
logoutClick: function (e) {
|
|
e.preventDefault();
|
|
|
|
this.authsCollectionView.collection.forEach(function (auth) {
|
|
window.swaggerUi.api.clientAuthorizations.remove(auth.get('title'));
|
|
});
|
|
|
|
this.router.load();
|
|
},
|
|
|
|
// taken from lib/swagger-oauth.js
|
|
handleOauth2Login: function (auth) {
|
|
var host = window.location;
|
|
var pathname = location.pathname.substring(0, location.pathname.lastIndexOf('/'));
|
|
var defaultRedirectUrl = host.protocol + '//' + host.host + pathname + '/o2c.html';
|
|
var redirectUrl = window.oAuthRedirectUrl || defaultRedirectUrl;
|
|
var url = null;
|
|
var scopes = _.map(auth.get('scopes'), function (scope) {
|
|
return scope.scope;
|
|
});
|
|
var state, dets, ep;
|
|
window.OAuthSchemeKey = auth.get('title');
|
|
|
|
window.enabledScopes = scopes;
|
|
var flow = auth.get('flow');
|
|
|
|
if(auth.get('type') === 'oauth2' && flow && (flow === 'implicit' || flow === 'accessCode')) {
|
|
dets = auth.attributes;
|
|
url = dets.authorizationUrl + '?response_type=' + (flow === 'implicit' ? 'token' : 'code');
|
|
window.swaggerUi.tokenName = dets.tokenName || 'access_token';
|
|
window.swaggerUi.tokenUrl = (flow === 'accessCode' ? dets.tokenUrl : null);
|
|
state = window.OAuthSchemeKey;
|
|
}
|
|
else if(auth.get('type') === 'oauth2' && flow && (flow === 'application')) {
|
|
dets = auth.attributes;
|
|
window.swaggerUi.tokenName = dets.tokenName || 'access_token';
|
|
this.clientCredentialsFlow(scopes, dets.tokenUrl, window.OAuthSchemeKey);
|
|
return;
|
|
}
|
|
else if(auth.get('grantTypes')) {
|
|
// 1.2 support
|
|
var o = auth.get('grantTypes');
|
|
for(var t in o) {
|
|
if(o.hasOwnProperty(t) && t === 'implicit') {
|
|
dets = o[t];
|
|
ep = dets.loginEndpoint.url;
|
|
url = dets.loginEndpoint.url + '?response_type=token';
|
|
window.swaggerUi.tokenName = dets.tokenName;
|
|
}
|
|
else if (o.hasOwnProperty(t) && t === 'accessCode') {
|
|
dets = o[t];
|
|
ep = dets.tokenRequestEndpoint.url;
|
|
url = dets.tokenRequestEndpoint.url + '?response_type=code';
|
|
window.swaggerUi.tokenName = dets.tokenName;
|
|
}
|
|
}
|
|
}
|
|
|
|
redirect_uri = redirectUrl;
|
|
|
|
url += '&redirect_uri=' + encodeURIComponent(redirectUrl);
|
|
url += '&realm=' + encodeURIComponent(realm);
|
|
url += '&client_id=' + encodeURIComponent(clientId);
|
|
url += '&scope=' + encodeURIComponent(scopes.join(scopeSeparator));
|
|
url += '&state=' + encodeURIComponent(state);
|
|
for (var key in additionalQueryStringParams) {
|
|
url += '&' + key + '=' + encodeURIComponent(additionalQueryStringParams[key]);
|
|
}
|
|
|
|
window.open(url);
|
|
},
|
|
|
|
// taken from lib/swagger-oauth.js
|
|
clientCredentialsFlow: function (scopes, tokenUrl, OAuthSchemeKey) {
|
|
var params = {
|
|
'client_id': clientId,
|
|
'client_secret': clientSecret,
|
|
'scope': scopes.join(' '),
|
|
'grant_type': 'client_credentials'
|
|
};
|
|
$.ajax({
|
|
url : tokenUrl,
|
|
type: 'POST',
|
|
data: params,
|
|
success: function (data)
|
|
{
|
|
onOAuthComplete(data, OAuthSchemeKey);
|
|
},
|
|
error: function ()
|
|
{
|
|
onOAuthComplete('');
|
|
}
|
|
});
|
|
}
|
|
|
|
});
|