1

Wir verwenden einen E-Mail-Dienstanbieter (ESP) von Drittanbietern, um E-Mails an unsere Kunden zu senden. Für eine der E-Mails muss eine Datei angehängt sein. Um dies zu erreichen, müssen wir dem ESP eine URL der Datei geben. Der ESP lädt die Datei herunter und hängt sie an die E-Mail an.Oauth2-Token, das den Zugriff auf eine einzige Ressource einschränkt

Wir arbeiten jetzt an einer Lösung zur Sicherung der URL, um das Risiko von nicht autorisierten Downloads zu begrenzen. Der ESP kann sich nicht selbst authentifizieren, während er die Anfrage an die URL richtet. Die einzige Option, die wir sehen, besteht darin, die URL nur schwer zu erraten und für eine begrenzte Zeit gültig zu machen.

Die Art und Weise, wie wir dies erreichen wollen, besteht darin, ein Token in den Querystring der URL zu setzen. Der Dienst, der die Datei hostet, validiert das Token und autorisiert den Zugriff. Das Token muss rechtzeitig ablaufen und nur Zugriff auf eine bestimmte Datei gewähren.

Wir haben bereits eine IdentityServer 3-Implementierung, die einen oAuth2 Security Token Service ausführt. Unser Plan sieht vor, dass dieser Dienst die Tokens generiert, die in die Abfragezeichenfolge der Datei-Download-URL eingefügt werden. Wir überlegen, einen benutzerdefinierten oAuth2-Grant-Typ zu erstellen, um Token zu unterstützen, die nur den Zugriff auf eine bestimmte Ressource erlauben.

Dies wäre ein Beispiel für eine Anforderung an den oauth2 Token-Endpunkt mit dem benutzerdefinierten Zuschuss: geben

POST /token HTTP/1.1 
Host: server.example.com 
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW 
Content-Type: application/x-www-form-urlencoded 

grant_type=custom_grant&scope=attachment.read&resource_id=xxxxx 

Der STS wird das Token ein Token mit einem Anspruch der Ressource-ID zurückzukehren Zugang zu.

Ist der richtige Anwendungsfall für einen benutzerdefinierten Grant-Typ oder sollten wir nach einer anderen Möglichkeit suchen, dies zu implementieren?

+0

kann nicht Client-Anmeldeinformationen für diese verwendet werden, gewähren (mit Rahmen, wie Sie beschrieben), aber der Anspruch an die ESP weitergegeben innerhalb für das Senden die URL? Ihr Client fragt den STS nach dem Token (Sie können sich mit Ihren privaten Anmeldeinformationen beim STS authentifizieren, um ein Zugriffstoken zu erhalten), das Sie dann als Anlagepfad übergeben können. – SilverlightFox

+0

Wir haben darüber nachgedacht, aber das Problem ist, dass dieses Zugriffstoken Zugriff auf alle Ressourcen für diesen Bereich statt auf einen bestimmten geben wird. Der Ressourcenbezeichner muss zum Token hinzugefügt werden, was in der Client-Berechtigungsnachweisgenehmigung nicht möglich ist. –

+1

Kann der Umfang nicht für einen einzelnen Anhang eingeschränkt werden? z.B. 'attachment.read.attachmentid.142184712984721' – SilverlightFox

Antwort

0

Ich denke, was Sie vorschlagen, ist in Ordnung, aber ich persönlich bevorzuge etwas auf der Grundlage kryptografischer Signaturen für diese Art von Sache.

JSON Web Token ist eine gut etablierte Möglichkeit, dies mit Unterstützung in vielen Programmiersprachen zu tun. Im Wesentlichen signieren Sie ein JSON-Wörterbuch einschließlich einer Ablaufzeit. Dann fügen Sie es an die URL an (z. B. als Abfrageparameter). Wenn Sie eine eingehende Anforderung erhalten, validieren Sie das Token, indem Sie die Signatur, die Ablaufzeit und die Ressource, für die es gilt, überprüfen.

Der Vorteil dieses Ansatzes besteht darin, dass es keinen unnötigen Zustand gibt: Sie müssen Token nirgendwo speichern und benötigen stattdessen nur einen Signaturschlüssel.

Hier ist ein Beispiel in Python, die die Grundidee zeigt:

import time 

import jwt 

SIGNING_SECRET = 'use-a-good-secret-here' 

token = jwt.encode({ 
    'resource_id': 'xxxxx', 
    # JSON spec establishes "exp" as meaning expiration time 
    'exp': time.time() + 1, # one second in the future for testing 
}, SIGNING_SECRET, algorithm='HS256') 

print(token) 

def try_decoding(token): 
    try: 
     decoded = jwt.decode(token, SIGNING_SECRET, algorithms=['HS256']) 
     print('Valid token for "{}"'.format(decoded['resource_id'])) 
    except jwt.exceptions.ExpiredSignatureError: 
     print('The token has expired.') 

try_decoding(token) # prints 'Valid token for "xxxxx"' 
print('Sleeping until the token expires...') 
time.sleep(2) 
try_decoding(token) # prints "The token has expired." 
+0

Wie können Sie die Signatur verifizieren, ich habe ein Access Token, aber ich kann es nicht entschlüsseln. – Jesse