ec2b666284
Continuous Integration / Pre-commit Linter (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.10) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.11) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.12) (push) Has been cancelled
Continuous Integration / Mypy Check (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.12) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / Unit Tests (Python 3.14) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.10) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.11) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.12) (push) Has been cancelled
Copybara PR Handler / close-imported-pr (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.13) (push) Has been cancelled
Continuous Integration / A2A v0.3 Tests (Python 3.14) (push) Has been cancelled
211 lines
9.9 KiB
HTML
211 lines
9.9 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="en">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>IDP Admin Portal</title>
|
|
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/css/bootstrap.min.css" rel="stylesheet">
|
|
<style>
|
|
body {
|
|
background-color: #f8f9fa;
|
|
}
|
|
.container {
|
|
max-width: 960px;
|
|
margin-top: 50px;
|
|
}
|
|
.card {
|
|
border-radius: 1rem;
|
|
box-shadow: 0 4px 8px rgba(0,0,0,0.1);
|
|
}
|
|
pre {
|
|
background-color: #e9ecef;
|
|
border-radius: 0.25rem;
|
|
padding: 1rem;
|
|
}
|
|
</style>
|
|
</head>
|
|
<body>
|
|
<div class="container">
|
|
<div class="card p-4">
|
|
<h1 class="text-center mb-4">IDP Administration Portal</h1>
|
|
<div id="alert-container"></div>
|
|
|
|
<!-- OpenID Configuration Section -->
|
|
<section class="mb-5">
|
|
<h2>OpenID Configuration</h2>
|
|
<form id="configForm">
|
|
<div class="mb-3">
|
|
<label for="issuer" class="form-label">Issuer</label>
|
|
<input type="text" class="form-control" id="issuer" value="{{ openid_config.issuer }}">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="authorization_endpoint" class="form-label">Authorization Endpoint</label>
|
|
<input type="text" class="form-control" id="authorization_endpoint" value="{{ openid_config.authorization_endpoint }}">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="token_endpoint" class="form-label">Token Endpoint</label>
|
|
<input type="text" class="form-control" id="token_endpoint" value="{{ openid_config.token_endpoint }}">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="jwks_uri" class="form-label">JWKS URI</label>
|
|
<input type="text" class="form-control" id="jwks_uri" value="{{ openid_config.jwks_uri }}">
|
|
</div>
|
|
<button type="submit" class="btn btn-primary">Update Configuration</button>
|
|
</form>
|
|
</section>
|
|
|
|
<hr>
|
|
|
|
<!-- Registries Section -->
|
|
<div class="row mt-4">
|
|
<!-- User Registry -->
|
|
<div class="col-md-6">
|
|
<h2>User Registry</h2>
|
|
<pre><code id="userRegistry">{{ user_registry }}</code></pre>
|
|
<h4 class="mt-4">Add New User</h4>
|
|
<form id="addUserForm">
|
|
<div class="mb-3">
|
|
<label for="username" class="form-label">Username</label>
|
|
<input type="text" class="form-control" id="username" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="password" class="form-label">Password</label>
|
|
<input type="password" class="form-control" id="password" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="sub" class="form-label">Subject (sub)</label>
|
|
<input type="text" class="form-control" id="sub" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="email" class="form-label">Email</label>
|
|
<input type="email" class="form-control" id="email">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="profile" class="form-label">Profile</label>
|
|
<input type="text" class="form-control" id="profile">
|
|
</div>
|
|
<button type="submit" class="btn btn-success">Add User</button>
|
|
</form>
|
|
</div>
|
|
<!-- Client Registry -->
|
|
<div class="col-md-6">
|
|
<h2>Client Registry</h2>
|
|
<pre><code id="clientRegistry">{{ client_registry }}</code></pre>
|
|
<h4 class="mt-4">Add New Client</h4>
|
|
<form id="addClientForm">
|
|
<div class="mb-3">
|
|
<label for="client_id" class="form-label">Client ID</label>
|
|
<input type="text" class="form-control" id="client_id" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="client_name" class="form-label">Client Name</label>
|
|
<input type="text" class="form-control" id="client_name" required>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="client_secret" class="form-label">Client Secret</label>
|
|
<input type="text" class="form-control" id="client_secret">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="redirect_uri" class="form-label">Redirect URIs (space-separated)</label>
|
|
<input type="text" class="form-control" id="redirect_uri">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="allowed_scopes" class="form-label">Allowed Scopes (space-separated)</label>
|
|
<input type="text" class="form-control" id="allowed_scopes">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="response_types" class="form-label">Response Types (space-separated)</label>
|
|
<input type="text" class="form-control" id="response_types">
|
|
</div>
|
|
<div class="mb-3">
|
|
<label for="grant_types" class="form-label">Grant Types (space-separated)</label>
|
|
<input type="text" class="form-control" id="grant_types">
|
|
</div>
|
|
<button type="submit" class="btn btn-success">Add Client</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<script>
|
|
const alertContainer = document.getElementById('alert-container');
|
|
|
|
function showAlert(message, type = 'success') {
|
|
const wrapper = document.createElement('div');
|
|
wrapper.innerHTML = [
|
|
`<div class="alert alert-${type} alert-dismissible" role="alert">`,
|
|
` <div>${message}</div>`,
|
|
' <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>',
|
|
'</div>'
|
|
].join('');
|
|
alertContainer.append(wrapper);
|
|
}
|
|
|
|
// Update Config
|
|
document.getElementById('configForm').addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
const data = {
|
|
issuer: document.getElementById('issuer').value,
|
|
authorization_endpoint: document.getElementById('authorization_endpoint').value,
|
|
token_endpoint: document.getElementById('token_endpoint').value,
|
|
jwks_uri: document.getElementById('jwks_uri').value
|
|
};
|
|
|
|
const response = await fetch('/admin/update-config', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(data)
|
|
});
|
|
const result = await response.json();
|
|
showAlert(result.message, result.success ? 'success' : 'danger');
|
|
});
|
|
|
|
// Add User
|
|
document.getElementById('addUserForm').addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
const data = {
|
|
username: document.getElementById('username').value,
|
|
password: document.getElementById('password').value,
|
|
sub: document.getElementById('sub').value,
|
|
email: document.getElementById('email').value,
|
|
profile: document.getElementById('profile').value,
|
|
};
|
|
|
|
const response = await fetch('/admin/add-user', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(data)
|
|
});
|
|
const result = await response.json();
|
|
showAlert(result.message, result.success ? 'success' : 'danger');
|
|
if (result.success) location.reload();
|
|
});
|
|
|
|
// Add Client
|
|
document.getElementById('addClientForm').addEventListener('submit', async (e) => {
|
|
e.preventDefault();
|
|
const data = {
|
|
client_id: document.getElementById('client_id').value,
|
|
client_name: document.getElementById('client_name').value,
|
|
client_secret: document.getElementById('client_secret').value,
|
|
redirect_uri: document.getElementById('redirect_uri').value,
|
|
allowed_scopes: document.getElementById('allowed_scopes').value,
|
|
response_types: document.getElementById('response_types').value,
|
|
grant_types: document.getElementById('grant_types').value,
|
|
};
|
|
|
|
const response = await fetch('/admin/add-client', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json' },
|
|
body: JSON.stringify(data)
|
|
});
|
|
const result = await response.json();
|
|
showAlert(result.message, result.success ? 'success' : 'danger');
|
|
if (result.success) location.reload();
|
|
});
|
|
</script>
|
|
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.7/dist/js/bootstrap.bundle.min.js"></script>
|
|
</body>
|
|
</html>
|