open-vault/ui/app/components/oidc-consent-block.js
Chelsea Shaw 1f6329b1c2
UI/OIDC provider (#12800)
* 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
2021-10-13 15:04:39 -05:00

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;
}
}