1f6329b1c2
* Add new route w/ controller oidc-provider * oidc-provider controller has params, template has success message (temporary), model requests correct endpoint * Move oidc-provider route to under identity * Do not redirect after poll if on oidc-provider page * WIP provider -- beforeModel handles prompt, logout, redirect * Auth service fetch method rejects with fetch response if status >= 300 * New component OidcConsentBlock * Fix redirect to/from auth with cluster name, show error and consent form if applicable * Show error and consent form on template * Add component test, update docs * Test for oidc-consent-block component * Add changelog * fix tests * Add authorize to end of router path * Remove unused tests * Update changelog with feature name * Add descriptions for OidcConsentBlock component * glimmerize token-expire-warning and don't override yield if on oidc-provider route * remove text on token-expire-warning * Fix null transition.to on cluster redirect * Hide nav links if oidc-provider route
60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
/**
|
|
* @module OidcConsentBlock
|
|
* OidcConsentBlock components are used to show the consent form for the OIDC Authorization Code Flow
|
|
*
|
|
* @example
|
|
* ```js
|
|
* <OidcConsentBlock @redirect="https://example.com/oidc-callback" @code="abcd1234" @state="string-for-state" />
|
|
* ```
|
|
* @param {string} redirect - redirect is the URL where successful consent will redirect to
|
|
* @param {string} code - code is the string required to pass back to redirect on successful OIDC auth
|
|
* @param {string} [state] - state is a string which is required to return on redirect if provided, but optional generally
|
|
*/
|
|
|
|
import Ember from 'ember';
|
|
import Component from '@glimmer/component';
|
|
import { action } from '@ember/object';
|
|
import { tracked } from '@glimmer/tracking';
|
|
|
|
const validParameters = ['code', 'state'];
|
|
export default class OidcConsentBlockComponent extends Component {
|
|
@tracked didCancel = false;
|
|
|
|
get win() {
|
|
return this.window || window;
|
|
}
|
|
|
|
buildUrl(urlString, params) {
|
|
try {
|
|
let url = new URL(urlString);
|
|
Object.keys(params).forEach(key => {
|
|
if (params[key] && validParameters.includes(key)) {
|
|
url.searchParams.append(key, params[key]);
|
|
}
|
|
});
|
|
return url;
|
|
} catch (e) {
|
|
console.debug('DEBUG: parsing url failed for', urlString);
|
|
throw new Error('Invalid URL');
|
|
}
|
|
}
|
|
|
|
@action
|
|
handleSubmit(evt) {
|
|
evt.preventDefault();
|
|
let { redirect, ...params } = this.args;
|
|
let redirectUrl = this.buildUrl(redirect, params);
|
|
if (Ember.testing) {
|
|
this.args.testRedirect(redirectUrl.toString());
|
|
} else {
|
|
this.win.location.replace(redirectUrl);
|
|
}
|
|
}
|
|
|
|
@action
|
|
handleCancel(evt) {
|
|
evt.preventDefault();
|
|
this.didCancel = true;
|
|
}
|
|
}
|