1

私たちは顧客に電子メールを送信するために第三者の電子メールサービスプロバイダ(ESP)を利用しています。電子メールの1つにファイルが添付されている必要があります。これを達成するには、ESPにファイルのURLを与える必要があります。 ESPはファイルをダウンロードして電子メールに添付します。単一のリソースへのアクセスを制限するOauth2トークン

不正なダウンロードのリスクを制限するため、URLを保護するソリューションに取り組んでいます。 ESPはURLへのリクエスト中に自分自身を認証することはできませんので、URLを推測することを難しくし、限られた時間有効にするだけです。

これを達成する方法は、URLのクエリ文字列にトークンを入れることです。ファイルをホストするサービスは、トークンを検証し、アクセスを許可します。トークンは期限切れになる必要があり、特定のファイルにのみアクセスできるようにする必要があります。

すでに、oAuth2セキュリティトークンサービスを実行しているIdentityServer 3実装があります。私たちの計画は、このサービスがファイルダウンロードURLのクエリ文字列に入れられるトークンを生成させることです。特定のリソースへのアクセスのみを許可するトークンをサポートするカスタムoAuth2許可タイプの作成を検討しています。

これは、カスタム助成金とのOAuth2トークンエンドポイントへのリクエストの例のようになります。

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 

STSはトークンがへのアクセスを与えるリソースIDの主張にトークンを返します。

カスタム・グラント・タイプに適したユースケースですか、あるいはこれを実装する別の方法を検討する必要がありますか?

+0

は、クライアントの資格情報は、(あなたが説明するようにスコープで)このために使用することが付与することはできませんが、請求は内の送信のためにESPに渡され、 URL?すなわち、クライアントはSTSにトークンを要求する(アクセストークンを取得するために秘密の資格情報を使用してSTSに対して認証することができる)。これを添付ファイルパスとして渡すことができる。 – SilverlightFox

+0

私たちはそれについて考えましたが、問題は、このアクセストークンが特定のスコープではなく、そのスコープのすべてのリソースにアクセスできるということです。リソース識別子をトークンに追加する必要があります。これは、クライアントの資格情報付与では不可能です。 –

+1

1つの添付ファイルでスコープを絞り込むことはできませんか?例えば'attachment.read.attachmentid.142184712984721' – SilverlightFox

答えて

0

私はあなたが提案しているものは問題ないと思っていますが、私は個人的にこの種のものの暗号署名に基づいたものを使用することを好みます。

JSON Web Tokenは、これを多くのプログラミング言語でサポートするための確立された方法です。基本的に、有効期限を含むJSON辞書に署名します。 URLにURLを添付します(クエリパラメータなど)。インバウンド要求を受信すると、署名、有効期限、およびそれに適用されるリソースをチェックしてトークンを検証します。

このアプローチの利点は、不要な状態がないことです。トークンをどこにでも保存する必要はなく、代わりに署名キーが必要です。ここで

は、基本的な考え方を示してPythonでの例です:

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

どのように署名を確認できますか、私はアクセストークンを持っていますが、私はそれを解読できません。 – Jesse

関連する問題