Ontwikkel een OAuth 2.0 Flow voor Geavanceerde Scope Toewijzing op Basis van API Verzoekparameters
description
Met deze prompt kan de gebruiker een geavanceerde OAuth 2.0 flow ontwerpen die automatisch scopes toewijst op basis van specifieke API-verzoekparameters. Dit lost het probleem op van statische scope-toewijzing en verhoogt zowel flexibiliteit als beveiliging. Het is beter dan alternatieven omdat het fijnmazige toegang mogelijk maakt die direct aansluit op de context van het verzoek, wat risico’s minimaliseert en gebruikservaring verbetert.
prompt
Help me een OAuth 2.0 authenticatie- en autorisatiestroom te ontwerpen waarbij scopes automatisch worden toegewezen op basis van specifieke API-verzoekparameters. API-verzoekdetails: <voer de relevante API-verzoekparameters in> Toegangsvereisten: <beschrijf de ver ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Het ontwerpen van een OAuth 2.0-stroom waarbij scopes automatisch worden toegewezen op basis van API-verzoekparameters vereist een dynamische en veilige aanpak. Hier is een overzicht van hoe je dit kunt implementeren en best practices:
1. **Dynamische Scope-Definitie en Toewijzing**
- **Parameter-gebaseerde scope-logging:**
Ontwikkel een mechanisme waarin je API-verzoekparameters (zoals resource=profiel en actie=lezen) worden geëxtraheerd en geverifieerd voordat de scope wordt toegekend.
- **Scope-bepaling op serverniveau:**
Maak een mapping tussen API-verzoekparameters en vereiste scopes. Bijvoorbeeld:
```json
{
"resource": "profiel",
"actie": "lezen",
"scope": "profiel:lezen"
}
```
- **Automatische scope-toewijzing:**
Wanneer een client een OAuth-aanvraag doet, bepaal je automatisch de benodigde scopes op basis van de parameters die zij willen gebruiken. Dit kan gedaan worden via een autorisatieserver die de scope automatisch toewijst op basis van vooraf gedefinieerde regels.
2. **Implementatie in de OAuth-flow**
- **Authorization Endpoint:**
- Client initieert een OAuth 2.0 autorisatie-aanvraag met de gewenste API-permissies (de scopes).
- De autorisatieserver bepaalt op basis van de aanvraag en de API-verzoekparameters welke scopes nodig zijn en kan aanvullende verificatie eisen.
- **Token Endpoint:**
- Na succesvolle autorisatie wordt een access token uitgegeven met de automatisch toegewezen scopes.
3. **Gebruik van een Scope-Validatie Middleware**
- Tijdens API-aanroepen controleer je het access token en de scopes.
- Op basis van de verzoekparameters (resource=profiel, actie=lezen) wordt gecontroleerd of de scope die in het token staat voldoende rechten geeft.
4. **Beveiliging en Best Practices**
- **Minimalistische scopes:**
Definieer zo specifiek mogelijke scopes (bijvoorbeeld `profiel:lezen`) om het privilege minimalistisch te houden.
- **Scope-ondertekening en validatie:**
Overweeg het ondertekenen van scopes of het gebruik van claims in JWT-tokens voor extra verificatie.
- **Pre-autorisation en policies:**
Gebruik beleidssystemen (bijvoorbeeld OPA) om te bepalen of een scope-actie toegestaan is op basis van requestparameters en gebruikersrechten.
- **Logging en audit:**
Hou bij welke scopes worden toegekend en gebruikt, voor auditing en troubleshooting.
- **Flexibiliteit:**
Ontwerp je systeem zodanig dat nieuwe resource-typen en acties eenvoudig kunnen worden toegevoegd zonder grote wijzigingen in de scope-toewijzingslogica.
5. **Samenvatting**
- Ontwikkel een mapping tussen API-verzoekparameters en scopes.
- Laat de autorisatieserver dynamisch scopes toewijzen op basis van de API-aanvraag en parameters.
- Implementeer strikte scope-validatie en controle tijdens API-aanroepen.
- Zorg voor een balans tussen flexibiliteit en veiligheid door minimale scopes en beleidssystemen te gebruiken.
**Kortom:**
Gebruik een dynamische scope-toewijzing waarbij de autorisatieserver de API-verzoekparameters analyseert en op basis daarvan de juiste scopes toewijst. Combineer dit met strikte validatie, minimale scopes, en logging om zowel flexibiliteit als veiligheid te garanderen.
provider: deepseek
model: deepseek-chat
Zeker, ik help je graag een OAuth 2.0-stroom te ontwerpen met dynamische scope-toewijzing. Hier is een complete implementatie-uitleg in het Nederlands:
## Architectuur voor Dynamische Scope-toewijzing
### Basis OAuth 2.0-stroom met scope-aanpassing
```json
// Authorization Request met parameters
{
"client_id": "jouw-client-id",
"redirect_uri": "https://jouw-app.nl/callback",
"response_type": "code",
"scope": "profiel_basis", // Initiële basis-scope
"state": "random-secure-string",
"resource": "profiel",
"action": "lezen"
}
```
## Implementatiestappen
### 1. Authorization Server Aanpassingen
```javascript
// Scope mapping logica
const scopeMapping = {
'profiel_lezen': {
resource: 'profiel',
action: 'lezen',
required_scopes: ['profiel:lezen', 'profiel:metadata', 'profiel:contact']
},
'profiel_beheren': {
resource: 'profiel',
action: 'wijzigen',
required_scopes: ['profiel:schrijven', 'profiel:verwijderen']
}
};
function determineDynamicScopes(authRequest) {
const { resource, action } = authRequest;
// Valideer en map naar scopes
const scopeKey = `${resource}_${action}`;
const mapping = scopeMapping[scopeKey];
if (!mapping) {
throw new Error('Ongeldige resource/actie combinatie');
}
return mapping.required_scopes.join(' ');
}
```
### 2. Token Endpoint Aanpassing
```javascript
app.post('/token', async (req, res) => {
const { code, client_id, client_secret } = req.body;
// Valideer authorization code
const authCode = await validateAuthorizationCode(code);
// Gebruik dynamische scopes uit auth code
const tokenScopes = authCode.dynamic_scopes || authCode.requested_scopes;
// Genereer access token
const accessToken = await generateAccessToken({
client_id,
scopes: tokenScopes,
expires_in: 3600
});
res.json({
access_token: accessToken,
token_type: "Bearer",
expires_in: 3600,
scope: tokenScopes
});
});
```
## Beveiligingsmaatregelen
### 1. Scope Validatie Middleware
```javascript
function validateScopes(requiredScopes) {
return (req, res, next) => {
const tokenScopes = req.auth.scopes;
// Controleer of alle vereiste scopes aanwezig zijn
const hasRequiredScopes = requiredScopes.every(scope =>
tokenScopes.includes(scope)
);
if (!hasRequiredScopes) {
return res.status(403).json({
error: 'insufficient_scope',
error_description: 'Token heeft onvoldoende rechten'
});
}
next();
};
}
// Gebruik in API routes
app.get('/profiel',
validateScopes(['profiel:lezen', 'profiel:metadata']),
(req, res) => {
// Profiel data retourneren
}
);
```
### 2. Parameter Validatie
```javascript
function validateAuthParameters(params) {
const allowedResources = ['profiel', 'account', 'instellingen'];
const allowedActions = ['lezen', 'wijzigen', 'verwijderen'];
if (!allowedResources.includes(params.resource)) {
throw new Error('Ongeldige resource parameter');
}
if (!allowedActions.includes(params.action)) {
throw new Error('Ongeldige actie parameter');
}
// Preventie tegen scope escalation
if (params.action === 'verwijderen' && !isAdminUser(params.user)) {
throw new Error('Onvoldoende rechten voor deze actie');
}
}
```
## Best Practices voor Veiligheid
### 1. Scope Minimalisatie
```javascript
// Gebruik principle of least privilege
const minimalScopes = {
'profiel_lezen_basis': ['profiel:lezen'],
'profiel_lezen_compleet': ['profiel:lezen', 'profiel:metadata', 'profiel:contact']
};
// Kies de minimale set scopes voor de gevraagde actie
function getMinimalScopes(resource, action, context) {
const baseScopes = scopeMapping[`${resource}_${action}`].required_scopes;
// Verwijder onnodige scopes op basis van context
return baseScopes.filter(scope => isScopeNeeded(scope, context));
}
```
### 2. Audit Logging
```javascript
async function logScopeAssignment(authRequest, assignedScopes, user) {
await auditLogger.log({
event: 'scope_assignment',
timestamp: new Date(),
user_id: user.id,
client_id: authRequest.client_id,
requested_resource: authRequest.resource,
requested_action: authRequest.action,
assigned_scopes: assignedScopes,
ip_address: authRequest.ip
});
}
```
### 3. Rate Limiting
```javascript
const rateLimit = require('express-rate-limit');
const scopeChangeLimiter = rateLimit({
windowMs: 15 * 60 * 1000, // 15 minuten
max: 10, // Maximaal 10 scope wijzigingen per window
message: {
error: 'too_many_scope_requests',
error_description: 'Te veel scope wijzigingsverzoeken'
}
});
```
## Client Implementatie
### 1. Authorization Request
```javascript
async function requestAuthorization() {
const authUrl = new URL('https://auth-server.nl/authorize');
authUrl.searchParams.set('client_id', CLIENT_ID);
authUrl.searchParams.set('redirect_uri', REDIRECT_URI);
authUrl.searchParams.set('response_type', 'code');
authUrl.searchParams.set('scope', 'profiel_basis');
authUrl.searchParams.set('resource', 'profiel');
authUrl.searchParams.set('action', 'lezen');
authUrl.searchParams.set('state', generateSecureState());
// Redirect gebruiker naar auth server
window.location.href = authUrl.toString();
}
```
## Aanbevolen Beveiligingsmaatregelen
1. **Always Validate**: Valideer alle invoerparameters grondig
2. **Use HTTPS**: Altijd HTTPS voor alle OAuth communicatie
3. **Short-lived Tokens**: Gebruik tokens met korte levensduur (max 1 uur)
4. **Scope Review**: Laat gebruikers geassigneerde scopes reviewen
5. **Regular Audits**: Voer regelmatig security audits uit
6. **PKCE**: Implementeer Proof Key for Code Exchange voor public clients
Deze implementatie biedt flexibiliteit voor dynamische scope-toewijzing terwijl de veiligheid gewaarborgd blijft door middel van grondige validatie en het principe van minimale rechten.