github.com/anth0d/nomad@v0.0.0-20221214183521-ae3a0a2cad06/ui/app/templates/settings/tokens.hbs (about) 1 {{page-title "Authorization"}} 2 <section class="section authorization-page"> 3 {{#if this.isValidatingToken}} 4 <LoadingSpinner /> 5 {{else}} 6 <h1 class="title">Authorization and access control</h1> 7 8 <div class="status-notifications {{if this.canSignIn "is-half"}}"> 9 10 {{#if (eq this.signInStatus "failure")}} 11 <div data-test-token-error class="notification is-danger"> 12 <div class="columns"> 13 <div class="column"> 14 <h3 class="title is-4">Token Failed to Authenticate</h3> 15 <p>The token secret you have provided does not match an existing token, or has expired.</p> 16 </div> 17 </div> 18 </div> 19 {{/if}} 20 21 {{#if this.tokenRecord.isExpired}} 22 <div data-test-token-expired class="notification is-danger"> 23 <div class="columns"> 24 <div class="column"> 25 <h3 class="title is-4">Your authentication has expired</h3> 26 <p>Expired {{moment-from-now this.tokenRecord.expirationTime interval=1000}} ({{this.tokenRecord.expirationTime}})</p> 27 </div> 28 <div class="column is-centered is-minimum"> 29 <button data-test-token-clear class="button" {{action "clearTokenProperties"}} type="button">Sign In Again</button> 30 </div> 31 </div> 32 </div> 33 {{else}} 34 {{#if (eq this.signInStatus "success")}} 35 <div data-test-token-success class="notification is-success"> 36 <div class="columns"> 37 <div class="column"> 38 <h3 class="title is-4">Token Authenticated!</h3> 39 <p>Your token is valid and authorized for the following policies.</p> 40 </div> 41 </div> 42 </div> 43 {{/if}} 44 {{/if}} 45 46 {{#if this.token.tokenNotFound}} 47 <div data-test-token-not-found class="notification is-danger"> 48 <div class="columns"> 49 <div class="column"> 50 <h3 class="title is-4">Your token was not found</h3> 51 <p>It may have expired, or been entered incorrectly.</p> 52 </div> 53 </div> 54 </div> 55 {{/if}} 56 57 {{#if this.SSOFailure}} 58 <div data-test-sso-error class="notification is-danger column"> 59 <div class="columns"> 60 <div class="column"> 61 <h3 class="title is-4">Failed to sign in with SSO</h3> 62 <p>Your OIDC provider has failed on sign in; please try again or contact your SSO administrator.</p> 63 </div> 64 <div class="column is-centered is-minimum"> 65 <button data-test-sso-error-clear class="button" {{action (mut this.state)}} type="button">Clear</button> 66 </div> 67 </div> 68 </div> 69 {{/if}} 70 </div> 71 72 <div class="columns"> 73 {{#if this.canSignIn}} 74 <div class="column is-half sign-in-methods"> 75 {{#if this.authMethods.length}} 76 <h3 class="title is-4">Sign in with SSO</h3> 77 <p>Sign in to Nomad using the configured authorization provider. After logging in, the policies and rules for the token will be listed.</p> 78 <div class="sso-auth-methods"> 79 {{#each this.model.authMethods as |method|}} 80 <button 81 data-test-auth-method 82 class="button is-primary" 83 onclick={{action "redirectToSSO" method}} 84 type="button" 85 >Sign in with with {{method.name}} 86 </button> 87 {{/each}} 88 </div> 89 <span class="or-divider"><span>Or</span></span> 90 {{/if}} 91 92 <h3 class="title is-4">Sign in with token</h3> 93 <p>Clusters that use Access Control Lists require tokens to perform certain tasks. By providing a token Secret ID, each future request will be authenticated, potentially authorizing read access to additional information.</p> 94 <label class="label" for="token-input">Secret ID</label> 95 <div class="control"> 96 <Input 97 id="token-input" 98 class="input" 99 @type="text" 100 placeholder="XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX" 101 {{!-- FIXME this placeholder gets read out by VoiceOver sans dashes 😵 --}} 102 {{autofocus}} 103 {{on "input" (action (mut this.secret) value="target.value")}} 104 @enter={{this.verifyToken}} 105 data-test-token-secret /> 106 </div> 107 <p class="help">Sent with every request to determine authorization</p> 108 <button disabled={{not this.secret}} data-test-token-submit class="button is-primary" {{action "verifyToken"}} type="button">Set Token</button> 109 </div> 110 {{/if}} 111 112 {{#if this.shouldShowPolicies}} 113 <div class="column"> 114 {{#unless this.tokenRecord.isExpired}} 115 <div class="columns"> 116 <div class="column"> 117 <h3 data-test-token-name class="title is-4">Token: {{this.tokenRecord.name}}</h3> 118 <div>AccessorID: <code>{{this.tokenRecord.accessor}}</code></div> 119 <div>SecretID: <code>{{this.tokenRecord.secret}}</code></div> 120 {{#if this.tokenRecord.expirationTime}} 121 <div data-test-token-expiry>Expires: {{moment-from-now this.tokenRecord.expirationTime interval=1000}} <span data-test-expiration-timestamp>({{this.tokenRecord.expirationTime}})</span></div> 122 {{/if}} 123 </div> 124 <div class="column is-minimum"> 125 <button data-test-token-clear class="button is-primary" {{action "clearTokenProperties"}} type="button">Sign Out</button> 126 </div> 127 </div> 128 <h3 class="title is-4">Policies</h3> 129 {{#if (eq this.tokenRecord.type "management")}} 130 <div data-test-token-management-message class="boxed-section"> 131 <div class="boxed-section-body has-centered-text"> 132 The management token has all permissions 133 </div> 134 </div> 135 {{else}} 136 {{#each this.tokenRecord.policies as |policy|}} 137 <div data-test-token-policy class="boxed-section"> 138 <div data-test-policy-name class="boxed-section-head"> 139 {{policy.name}} 140 </div> 141 <div class="boxed-section-body"> 142 <p data-test-policy-description class="content"> 143 {{#if policy.description}} 144 {{policy.description}} 145 {{else}} 146 <em>No description</em> 147 {{/if}} 148 </p> 149 <pre><code data-test-policy-rules>{{policy.rules}}</code></pre> 150 </div> 151 </div> 152 {{/each}} 153 {{/if}} 154 {{/unless}} 155 </div> 156 {{/if}} 157 </div> 158 159 {{/if}} 160 </section> 161