170 lines
5.1 KiB
HTML
170 lines
5.1 KiB
HTML
{% extends "page.html" %}
|
|
|
|
{% block main %}
|
|
|
|
<div class="container-fluid" style="margin:50px 50px 50px 50px">
|
|
<div class="row">
|
|
<form id="request-token-form" class="col-md-offset-3 col-md-6">
|
|
<div class="text-center">
|
|
<button type="submit" class="btn btn-lg btn-jupyter">
|
|
Request new API token
|
|
</button>
|
|
</div>
|
|
<div class="form-group">
|
|
<label for="token-note">Note</label>
|
|
<input
|
|
id="token-note"
|
|
class="form-control"
|
|
placeholder="note to identify your new token">
|
|
<small id="note-note" class="form-text text-muted">
|
|
This note will help you keep track of what your tokens are for.
|
|
</small>
|
|
<br><br>
|
|
<label for="token-expiration-seconds">Token expires</label>
|
|
{% block expiration_options %}
|
|
<select id="token-expiration-seconds"
|
|
class="form-control">
|
|
<!-- unit used for each value is `seconds` -->
|
|
<option value="3600">1 Hour</option>
|
|
<option value="86400">1 Day</option>
|
|
<option value="604800">1 Week</option>
|
|
<option value="" selected="selected">Never</option>
|
|
</select>
|
|
{% endblock expiration_options %}
|
|
<small id="note-expires-at" class="form-text text-muted">
|
|
You can configure when your token will be expired.
|
|
</small>
|
|
</div>
|
|
</form>
|
|
</div>
|
|
|
|
<div class="row">
|
|
<div id="token-area" class="col-md-6 col-md-offset-3" style="display: none;">
|
|
<div class="panel panel-default">
|
|
<div class="panel-heading">
|
|
Your new API Token
|
|
</div>
|
|
<div class="panel-body">
|
|
<p class="lead text-center">
|
|
<span id="token-result"></span>
|
|
</p>
|
|
<p>
|
|
Copy this token. You won't be able to see it again,
|
|
but you can always come back here to get a new one.
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
{% if api_tokens %}
|
|
<div class="row">
|
|
<h2>API Tokens</h2>
|
|
<p>
|
|
These are tokens with full access to the JupyterHub API.
|
|
Anything you can do with JupyterHub can be done with these tokens.
|
|
Revoking the API token for a running server will require restarting that server.
|
|
</p>
|
|
<table class="table table-striped">
|
|
<thead>
|
|
<tr>
|
|
<td>Note</td>
|
|
<td>Last used</td>
|
|
<td>Created</td>
|
|
<td>Expires at</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for token in api_tokens %}
|
|
<tr class="token-row" data-token-id="{{token.api_id}}">
|
|
{% block token_row scoped %}
|
|
<td class="note-col col-sm-5">{{token.note}}</td>
|
|
<td class="time-col col-sm-3">
|
|
{%- if token.last_activity -%}
|
|
{{ token.last_activity.isoformat() + 'Z' }}
|
|
{%- else -%}
|
|
Never
|
|
{%- endif -%}
|
|
</td>
|
|
<td class="time-col col-sm-3">
|
|
{%- if token.created -%}
|
|
{{ token.created.isoformat() + 'Z' }}
|
|
{%- else -%}
|
|
N/A
|
|
{%- endif -%}
|
|
</td>
|
|
<td class="time-col col-sm-3">
|
|
{%- if token.expires_at -%}
|
|
{{ token.expires_at.isoformat() + 'Z' }}
|
|
{%- else -%}
|
|
Never
|
|
{%- endif -%}
|
|
</td>
|
|
<td class="col-sm-1 text-center">
|
|
<button class="revoke-token-btn btn btn-xs btn-danger">revoke</button>
|
|
</td>
|
|
{% endblock token_row %}
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
|
|
{% if oauth_clients %}
|
|
<div class="row">
|
|
<h2>Authorized Applications</h2>
|
|
<p>
|
|
These are applications that use OAuth with JupyterHub
|
|
to identify users (mostly notebook servers).
|
|
|
|
OAuth tokens can generally only be used to identify you,
|
|
not take actions on your behalf.
|
|
</p>
|
|
<table class="table table-striped">
|
|
<thead>
|
|
<tr>
|
|
<td>Application</td>
|
|
<td>Last used</td>
|
|
<td>First authorized</td>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for client in oauth_clients %}
|
|
<tr class="token-row"
|
|
data-token-id="{{ client['token_id'] }}">
|
|
{% block client_row scoped %}
|
|
<td class="note-col col-sm-5">{{ client['description'] }}</td>
|
|
<td class="time-col col-sm-3">
|
|
{%- if client['last_activity'] -%}
|
|
{{ client['last_activity'].isoformat() + 'Z' }}
|
|
{%- else -%}
|
|
Never
|
|
{%- endif -%}
|
|
</td>
|
|
<td class="time-col col-sm-3">
|
|
{%- if client['created'] -%}
|
|
{{ client['created'].isoformat() + 'Z' }}
|
|
{%- else -%}
|
|
N/A
|
|
{%- endif -%}
|
|
</td>
|
|
<td class="col-sm-1 text-center">
|
|
<button class="revoke-token-btn btn btn-xs btn-danger">revoke</button>
|
|
{% endblock client_row %}
|
|
</tr>
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endblock main %}
|
|
|
|
{% block script %}
|
|
{{ super() }}
|
|
<script type="text/javascript">
|
|
require(["token"]);
|
|
</script>
|
|
{% endblock script %}
|