mirror of
https://github.com/documize/community.git
synced 2025-07-19 21:29:42 +02:00
keycloak logout and auth provider switching
This commit is contained in:
parent
8c062d592a
commit
0f9d673eb5
12 changed files with 78 additions and 45 deletions
|
@ -18,7 +18,7 @@ v0.44.0
|
||||||
|
|
||||||
## Tech stack
|
## Tech stack
|
||||||
|
|
||||||
- EmberJS (v2.11.2)
|
- EmberJS (v2.12.0)
|
||||||
- Go (v1.8)
|
- Go (v1.8)
|
||||||
- MySQL (v5.7.10+) or Percona (v5.7.16-10+)
|
- MySQL (v5.7.10+) or Percona (v5.7.16-10+)
|
||||||
|
|
||||||
|
@ -38,7 +38,6 @@ Documize is compatible with Auth0 identity as a service.
|
||||||
|
|
||||||
[](https://auth0.com/?utm_source=oss&utm_medium=gp&utm_campaign=oss)
|
[](https://auth0.com/?utm_source=oss&utm_medium=gp&utm_campaign=oss)
|
||||||
|
|
||||||
|
|
||||||
Open Source Identity and Access Management
|
Open Source Identity and Access Management
|
||||||
|
|
||||||
## Word Conversion to HTML
|
## Word Conversion to HTML
|
||||||
|
|
|
@ -23,6 +23,7 @@ const {
|
||||||
export default Base.extend({
|
export default Base.extend({
|
||||||
ajax: service(),
|
ajax: service(),
|
||||||
appMeta: service(),
|
appMeta: service(),
|
||||||
|
localStorage: service(),
|
||||||
|
|
||||||
restore(data) {
|
restore(data) {
|
||||||
// TODO: verify authentication data
|
// TODO: verify authentication data
|
||||||
|
@ -57,6 +58,7 @@ export default Base.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
invalidate() {
|
invalidate() {
|
||||||
|
this.get('localStorage').clearAll();
|
||||||
return resolve();
|
return resolve();
|
||||||
}
|
}
|
||||||
});
|
});
|
|
@ -22,6 +22,8 @@ const {
|
||||||
export default Base.extend({
|
export default Base.extend({
|
||||||
ajax: service(),
|
ajax: service(),
|
||||||
appMeta: service(),
|
appMeta: service(),
|
||||||
|
kcAuth: service(),
|
||||||
|
localStorage: service(),
|
||||||
|
|
||||||
restore(data) {
|
restore(data) {
|
||||||
// TODO: verify authentication data
|
// TODO: verify authentication data
|
||||||
|
@ -46,6 +48,7 @@ export default Base.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
invalidate() {
|
invalidate() {
|
||||||
return resolve();
|
this.get('localStorage').clearAll();
|
||||||
|
return this.get('kcAuth').logout();
|
||||||
}
|
}
|
||||||
});
|
});
|
|
@ -18,9 +18,9 @@ const {
|
||||||
} = Ember;
|
} = Ember;
|
||||||
|
|
||||||
export default Ember.Component.extend({
|
export default Ember.Component.extend({
|
||||||
|
appMeta: Ember.inject.service(),
|
||||||
isDocumizeProvider: computed.equal('authProvider', constants.AuthProvider.Documize),
|
isDocumizeProvider: computed.equal('authProvider', constants.AuthProvider.Documize),
|
||||||
isKeycloakProvider: computed.equal('authProvider', constants.AuthProvider.Keycloak),
|
isKeycloakProvider: computed.equal('authProvider', constants.AuthProvider.Keycloak),
|
||||||
|
|
||||||
KeycloakUrlError: computed.empty('keycloakConfig.url'),
|
KeycloakUrlError: computed.empty('keycloakConfig.url'),
|
||||||
KeycloakRealmError: computed.empty('keycloakConfig.realm'),
|
KeycloakRealmError: computed.empty('keycloakConfig.realm'),
|
||||||
KeycloakClientIdError: computed.empty('keycloakConfig.clientId'),
|
KeycloakClientIdError: computed.empty('keycloakConfig.clientId'),
|
||||||
|
|
|
@ -25,11 +25,7 @@ export default Ember.Route.extend({
|
||||||
|
|
||||||
beforeModel(transition) {
|
beforeModel(transition) {
|
||||||
this.set('mode', is.not.undefined(transition.queryParams.mode) ? transition.queryParams.mode : 'login');
|
this.set('mode', is.not.undefined(transition.queryParams.mode) ? transition.queryParams.mode : 'login');
|
||||||
|
if (this.get('appMeta.authProvider') !== constants.AuthProvider.Keycloak) {
|
||||||
let authProvider = this.get('appMeta.authProvider');
|
|
||||||
let authConfig = this.get('appMeta.authConfig');
|
|
||||||
|
|
||||||
if (authProvider !== constants.AuthProvider.Keycloak) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,12 +33,12 @@ export default Ember.Route.extend({
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.get('kcAuth').boot(JSON.parse(authConfig)).then((kc) => {
|
this.get('kcAuth').boot().then((kc) => {
|
||||||
if (!kc.authenticated) {
|
if (!kc.authenticated) {
|
||||||
this.get('kcAuth').login().then(() => {
|
this.get('kcAuth').login().then(() => {
|
||||||
}, (reject) => {
|
}, (reject) => {
|
||||||
this.get('localStorage').storeSessionItem('kc-error', reject);
|
this.get('localStorage').storeSessionItem('kc-error', reject);
|
||||||
this.transitionTo('auth.keycloak', { queryParams: { mode: 'reject' }});
|
this.set('mode', 'reject');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,16 +49,16 @@ export default Ember.Route.extend({
|
||||||
this.transitionTo('folders');
|
this.transitionTo('folders');
|
||||||
}, (reject) => {
|
}, (reject) => {
|
||||||
this.get('localStorage').storeSessionItem('kc-error', reject);
|
this.get('localStorage').storeSessionItem('kc-error', reject);
|
||||||
this.transitionTo('auth.keycloak', { queryParams: { mode: 'reject' }});
|
this.set('mode', 'reject');
|
||||||
});
|
});
|
||||||
|
|
||||||
}, (reject) => {
|
}, (reject) => {
|
||||||
this.get('localStorage').storeSessionItem('kc-error', reject);
|
this.get('localStorage').storeSessionItem('kc-error', reject);
|
||||||
this.transitionTo('auth.keycloak', { queryParams: { mode: 'reject' }});
|
this.set('mode', 'reject');
|
||||||
});
|
});
|
||||||
}, (reject) => {
|
}, (reject) => {
|
||||||
this.get('localStorage').storeSessionItem('kc-error', reject);
|
this.get('localStorage').storeSessionItem('kc-error', reject);
|
||||||
this.transitionTo('auth.keycloak', { queryParams: { mode: 'reject' }});
|
this.set('mode', 'reject');
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -20,13 +20,12 @@ export default Ember.Route.extend({
|
||||||
|
|
||||||
beforeModel(/*transition*/) {
|
beforeModel(/*transition*/) {
|
||||||
let authProvider = this.get('appMeta.authProvider');
|
let authProvider = this.get('appMeta.authProvider');
|
||||||
let authConfig = this.get('appMeta.authConfig');
|
|
||||||
|
|
||||||
switch (authProvider) {
|
switch (authProvider) {
|
||||||
case constants.AuthProvider.Keycloak:
|
case constants.AuthProvider.Keycloak:
|
||||||
this.set('showLogin', false);
|
this.set('showLogin', false);
|
||||||
|
|
||||||
this.get('kcAuth').boot(JSON.parse(authConfig)).then(() => {
|
this.get('kcAuth').boot().then(() => {
|
||||||
this.get('kcAuth').login().then(() => {
|
this.get('kcAuth').login().then(() => {
|
||||||
}, (reject) => {
|
}, (reject) => {
|
||||||
this.get('localStorage').storeSessionItem('kc-error', reject);
|
this.get('localStorage').storeSessionItem('kc-error', reject);
|
||||||
|
|
|
@ -17,10 +17,10 @@ export default Ember.Route.extend({
|
||||||
appMeta: Ember.inject.service(),
|
appMeta: Ember.inject.service(),
|
||||||
|
|
||||||
activate: function () {
|
activate: function () {
|
||||||
this.get('session').invalidate();
|
this.audit.record("logged-out");
|
||||||
this.audit.record("logged-in");
|
|
||||||
this.audit.stop();
|
this.audit.stop();
|
||||||
|
|
||||||
|
this.get('session').invalidate().then(() => {
|
||||||
if (config.environment === 'test') {
|
if (config.environment === 'test') {
|
||||||
this.transitionTo('auth.login');
|
this.transitionTo('auth.login');
|
||||||
} else {
|
} else {
|
||||||
|
@ -30,5 +30,6 @@ export default Ember.Route.extend({
|
||||||
this.transitionTo('auth.login');
|
this.transitionTo('auth.login');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -1 +1,4 @@
|
||||||
{{outlet}}
|
<div class="sso-box">
|
||||||
|
<p>Logging out...</p>
|
||||||
|
<img src="/assets/img/busy-gray.gif" />
|
||||||
|
</div>
|
||||||
|
|
|
@ -15,6 +15,7 @@ import NotifierMixin from "../../../mixins/notifier";
|
||||||
export default Ember.Controller.extend(NotifierMixin, {
|
export default Ember.Controller.extend(NotifierMixin, {
|
||||||
global: Ember.inject.service(),
|
global: Ember.inject.service(),
|
||||||
appMeta: Ember.inject.service(),
|
appMeta: Ember.inject.service(),
|
||||||
|
session: Ember.inject.service(),
|
||||||
|
|
||||||
actions: {
|
actions: {
|
||||||
onSave(provider, config) {
|
onSave(provider, config) {
|
||||||
|
@ -23,8 +24,15 @@ export default Ember.Controller.extend(NotifierMixin, {
|
||||||
|
|
||||||
return this.get('global').saveAuthConfig(data).then(() => {
|
return this.get('global').saveAuthConfig(data).then(() => {
|
||||||
this.showNotification('Saved');
|
this.showNotification('Saved');
|
||||||
|
if (provider !== this.get('appMeta.authProvider')) {
|
||||||
|
this.get('session').logout();
|
||||||
this.set('appMeta.authProvider', provider);
|
this.set('appMeta.authProvider', provider);
|
||||||
this.set('appMeta.authConfig', config);
|
this.set('appMeta.authConfig', config);
|
||||||
|
window.location.href= '/';
|
||||||
|
} else {
|
||||||
|
this.set('appMeta.authProvider', provider);
|
||||||
|
this.set('appMeta.authConfig', config);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -23,11 +23,16 @@ export default Ember.Service.extend({
|
||||||
appMeta: service(),
|
appMeta: service(),
|
||||||
keycloak: null,
|
keycloak: null,
|
||||||
|
|
||||||
boot(options) {
|
init () {
|
||||||
this.set('keycloak', new Keycloak(options));
|
this._super(...arguments);
|
||||||
|
this.keycloak = null;
|
||||||
|
},
|
||||||
|
|
||||||
|
boot() {
|
||||||
|
this.set('keycloak', new Keycloak(JSON.parse(this.get('appMeta.authConfig'))));
|
||||||
|
|
||||||
return new Ember.RSVP.Promise((resolve, reject) => {
|
return new Ember.RSVP.Promise((resolve, reject) => {
|
||||||
this.keycloak.init().success(() => {
|
this.get('keycloak').init().success(() => {
|
||||||
this.get('audit').record("initialized-keycloak");
|
this.get('audit').record("initialized-keycloak");
|
||||||
resolve(this.get('keycloak'));
|
resolve(this.get('keycloak'));
|
||||||
}).error((err) => {
|
}).error((err) => {
|
||||||
|
@ -37,15 +42,35 @@ export default Ember.Service.extend({
|
||||||
},
|
},
|
||||||
|
|
||||||
login() {
|
login() {
|
||||||
|
this.set('keycloak', new Keycloak(JSON.parse(this.get('appMeta.authConfig'))));
|
||||||
let url = netUtil.getAppUrl(netUtil.getSubdomain()) + '/auth/keycloak?mode=login';
|
let url = netUtil.getAppUrl(netUtil.getSubdomain()) + '/auth/keycloak?mode=login';
|
||||||
|
|
||||||
return new Ember.RSVP.Promise((resolve, reject) => {
|
return new Ember.RSVP.Promise((resolve, reject) => {
|
||||||
if (this.get('keycloak').authenticated) {
|
this.boot().then(() => {
|
||||||
return resolve(this.get('keycloak'));
|
this.get('keycloak').login({redirectUri: url}).success(() => {
|
||||||
}
|
return resolve();
|
||||||
|
}).error(() => {
|
||||||
|
return reject(new Error('login failed'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
this.get('keycloak').login( {redirectUri: url} );
|
logout() {
|
||||||
return reject();
|
this.set('keycloak', new Keycloak(JSON.parse(this.get('appMeta.authConfig'))));
|
||||||
|
|
||||||
|
return new Ember.RSVP.Promise((resolve, reject) => {
|
||||||
|
this.boot().then(() => {
|
||||||
|
this.get('keycloak').logout(JSON.parse(this.get('appMeta.authConfig'))).success(() => {
|
||||||
|
this.get('keycloak').clearToken();
|
||||||
|
resolve();
|
||||||
|
}).error((error) => {
|
||||||
|
this.get('keycloak').clearToken();
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
}, (error) => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,9 @@ export default SimpleAuthSession.extend({
|
||||||
ajax: service(),
|
ajax: service(),
|
||||||
appMeta: service(),
|
appMeta: service(),
|
||||||
store: service(),
|
store: service(),
|
||||||
|
localStorage: service(),
|
||||||
|
folderPermissions: null,
|
||||||
|
currentFolder: null,
|
||||||
isMac: false,
|
isMac: false,
|
||||||
isMobile: false,
|
isMobile: false,
|
||||||
authenticated: computed('user.id', function () {
|
authenticated: computed('user.id', function () {
|
||||||
|
@ -55,6 +57,7 @@ export default SimpleAuthSession.extend({
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
||||||
folderPermissions: null,
|
logout() {
|
||||||
currentFolder: null
|
this.get('localStorage').clearAll();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
|
@ -112,12 +112,6 @@ func AuthenticateKeycloak(w http.ResponseWriter, r *http.Request) {
|
||||||
if err == sql.ErrNoRows {
|
if err == sql.ErrNoRows {
|
||||||
log.Info("keycloak add user " + a.Email + " @ " + a.Domain)
|
log.Info("keycloak add user " + a.Email + " @ " + a.Domain)
|
||||||
|
|
||||||
p.Context.Transaction, err = request.Db.Beginx()
|
|
||||||
if err != nil {
|
|
||||||
writeTransactionError(w, method, err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
user = entity.User{}
|
user = entity.User{}
|
||||||
user.Firstname = a.Firstname
|
user.Firstname = a.Firstname
|
||||||
user.Lastname = a.Lastname
|
user.Lastname = a.Lastname
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue