Skip to content

Commit

Permalink
Implemented/Fixed OpenID Connect support
Browse files Browse the repository at this point in the history
  • Loading branch information
m-mohr committed May 12, 2020
1 parent c7f4713 commit 959ae43
Show file tree
Hide file tree
Showing 5 changed files with 22 additions and 29 deletions.
2 changes: 1 addition & 1 deletion .jshintrc
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@
"globals": {
"axios": true,
"define": true,
"UserManager": true
"OidcClient": true
}
}
24 changes: 16 additions & 8 deletions src/authprovider.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
const Environment = require('./env');
const Utils = require('@openeo/js-commons/src/utils');
const { UserManager } = require('oidc-client');
const OidcClient = require('oidc-client');

class AuthProvider {

Expand Down Expand Up @@ -78,6 +78,10 @@ class OidcProvider extends AuthProvider {
this.user = null;
}

static isSupported() {
return (Utils.isObject(OidcClient) && !!OidcClient.UserManager);
}

/**
* Globally sets the UI method (redirect, popup) to use for OIDC authentication.
*
Expand All @@ -100,7 +104,7 @@ class OidcProvider extends AuthProvider {
*/
static async signinCallback(provider = null) {
try {
var oidc = new UserManager();
var oidc = new OidcClient.UserManager();
if (OidcProvider.uiMethod === 'popup') {
await oidc.signinPopupCallback();
}
Expand Down Expand Up @@ -128,14 +132,14 @@ class OidcProvider extends AuthProvider {
if (!this.issuer || typeof this.issuer !== 'string') {
throw "No Issuer URL available for OpenID Connect";
}
else if (!this.client_id || typeof this.client_id !== 'string') {
else if (!client_id || typeof client_id !== 'string') {
throw "No Client ID specified for OpenID Connect";
}
else if (!this.redirect_uri || typeof this.redirect_uri !== 'string') {
else if (!redirect_uri || typeof redirect_uri !== 'string') {
throw "No Redirect URI specified for OpenID Connect";
}

this.manager = new UserManager(Object.assign({
this.manager = new OidcClient.UserManager(Object.assign({
client_id: client_id,
redirect_uri: redirect_uri,
authority: this.issuer.replace('/.well-known/openid-configuration', ''),
Expand All @@ -144,7 +148,7 @@ class OidcProvider extends AuthProvider {
}, options));

if (OidcProvider.uiMethod === 'popup') {
this.setUserOIDC(await this.manager.signinPopup());
this.setUser(await this.manager.signinPopup());
}
else {
await this.manager.signinRedirect();
Expand All @@ -167,7 +171,7 @@ class OidcProvider extends AuthProvider {
* Sets the OIDC User.
*
* @see https://github.com/IdentityModel/oidc-client-js/wiki#user
* @param {User} user - The OIDC User returned by OpenEO.signinCallbackOIDC(). Passing `null` resets OIDC authentication details.
* @param {User} user - The OIDC User returned by OidcProvider.signinCallback(). Passing `null` resets OIDC authentication details.
*/
setUser(user) {
if (!user) {
Expand All @@ -187,7 +191,11 @@ class OidcProvider extends AuthProvider {
*/
async logout() {
if (this.manager !== null) {
await this.manager.signoutRedirect();
try {
await this.manager.signoutRedirect();
} catch (error) {
console.warn(error);
}
super.logout();
this.manager = null;
this.setUser(null);
Expand Down
7 changes: 0 additions & 7 deletions src/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,6 @@
*/
module.exports = class Environment {

static checkOidcSupport() {
if (typeof UserManager === 'undefined') {
return false;
}
return true;
}

static handleErrorResponse(error) {
return new Promise((_, reject) => {
let fileReader = new FileReader();
Expand Down
14 changes: 5 additions & 9 deletions src/connection.js
Original file line number Diff line number Diff line change
Expand Up @@ -137,30 +137,30 @@ module.exports = class Connection {
* List all authentication methods supported by the back-end.
*
* @async
* @returns {object} An object containing AuthProviders.
* @returns {array} An array containing all supported AuthProviders (including all OIDC providers and HTTP Basic).
* @throws {Error}
*/
async listAuthProviders() {
if (this.authProviderList !== null) {
return this.authProviderList;
}

this.authProviderList = {};
this.authProviderList = [];
let cap = this.capabilities();

// Add OIDC providers
if (Environment.checkOidcSupport() && cap.hasFeature('authenticateOIDC')) {
if (cap.hasFeature('authenticateOIDC') && OidcProvider.isSupported()) {
let res = await this._get('/credentials/oidc');
if (Utils.isObject(res.data) && Array.isArray(res.data.providers)) {
for(let i in res.data.providers) {
this._addAuthProvider(new OidcProvider(this, res.data.providers[i]));
this.authProviderList.push(new OidcProvider(this, res.data.providers[i]));
}
}
}

// Add Basic provider
if (cap.hasFeature('authenticateBasic')) {
this._addAuthProvider(new BasicProvider(this));
this.authProviderList.push(new BasicProvider(this));
}

return this.authProviderList;
Expand All @@ -185,10 +185,6 @@ module.exports = class Connection {
return this.authProvider;
}

_addAuthProvider(provider) {
this.authProviderList[provider.getId()] = provider;
}

/**
* Get information about the authenticated user.
*
Expand Down
4 changes: 0 additions & 4 deletions src/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,6 @@ const path = require("path");
*/
module.exports = class Environment {

static checkOidcSupport() {
return false;
}

static handleErrorResponse(error) {
return new Promise((_, reject) => {
let chunks = [];
Expand Down

0 comments on commit 959ae43

Please sign in to comment.