2016-06-24 20 views
2

したがって、私はServiceStack APIで次の認証を実装する最善の方法を見つけようとしています。追加のユーザーapiキーを使用してアプリケーションのみのAPIキーとサービスの秘密を実装する

すべてのAPI呼び出しを、私たちが定義したアプリケーション(半分非公開)のみで利用できるようにしたいと考えています。これらのアプリケーションは、当社のテーブルにリンクされます。つまり、会社にリンクする1つのテーブルApplicationKeysがあるとします。

さらに、ユーザー(会社にもリンクしています)があります。これらのユーザーには、特定のユーザー関連の機能をアプリに許可するAPIキーを与えることもできます。

この2つのセキュリティレベルでアプリケーションがAPIにアクセスできるようにするには、どのように実装するのが最適な方法ですか。 1)アプリケーションの認証のみを必要とするエンドポイント2)アプリケーションとユーザーの両方を認証する必要があるエンドポイント。

さらに、上記の1または2を有効にすると、新しいJWT認証を使用できるようにしたいと考えています。

最初の考え(私がまだ取り組んでいること)は、1のカスタムAuthProviderです。私はApiAuthProviderを例として使用しています。 auth repoのタイプを変更して、会社とapiキーに対してのみ検証するようにする必要があります。しかし、たとえこの最初のビットが機能しても、私はそれをどのように拡張するのか分かりません。

答えて

2

同じHTTPベアラトークンが2つの異なるAPIキープロバイダをサポートする必要があるため、複数のAPI Key Authプロバイダをサポートしようとすると問題が発生します。

組み込みのApiKeyAuthProviderは、ユーザーAPIのキー用であり、ユーザーはAPIキーの1つを使用して認証することができます。

私たちの最初の考えは、ユーザーに結びついているAuthProviderとして統合するのではなく、これをリクエストフィルターの制限として実装することです。例えば、

あなたは、あなたのサービスに生成することができます
public class ValidateCompanyKeyAttribute : RequestFilterAttribute 
{ 
    public override void Execute(IRequest req, IResponse res, object responseDto) 
    { 
     var companyKey = req.Headers["X-Company-Key"]; 
     var company = GetValidCopmany(companyKey); 
     if (company == null) 
     { 
      res.StatusCode = (int)HttpStatusCode.Unauthorized; 
      res.EndRequest(); 
      return; 
     } 
     req.Items["company"] = company; //if info needed in Services 
    } 
} 

:だから私は、おそらくカスタムX-Company-Key HTTPヘッダーを追加し、会社のキー、たとえばを検証するために要求フィルター属性を追加するような何かをするだろう

[ValidateCompanyKey] 
public class CompanyServices : Service { ... } 

代替のアプローチは、すべての会社のAPIキーを保持し、どの会社がキーがApiKeyテーブルcustom ref data propertiesのいずれかを使用するためのものであることを維持するプレースホルダとして特別な「会社」ユーザーを作成することです。もちろん独自のカスタムAPI Key AuthProviderを作成している場合は、独自の明示的なフィールドを追加できます。このアプローチの利点は、同じ認証プロバイダーを使用してユーザーと企業APIキーの両方を検証できることです。 JWTのを使用すると、中に収まるようにどこ

[Authenticate] 
public class UserServices : Service { ... } 

わからない、HTTPリクエストのみを含めることができます。

はあなただけで、 ApiKeyAuthProviderを既存のServiceStackの [Authenticate]属性ビルトイン例えば使用できるAPIキーを経由してユーザーを検証するには1のベアラトークンを取得し、APIキーを使用して認証している場合は、JWTを使用して認証することはありません。もちろん、両方のAuthProvidersを登録して、ユーザが自分の好みを使って認証できるようにすることもできます。

+1

お返事ありがとうございます。まず、私はJWTがどのように機能しているのか誤解し、この解決策の一部ではないことを認識しました。 カスタムリクエストフィルタとhmac認証方式を実装しました。私はいくつかのカスタムヘッダー(appId、署名、apiKey)を使用します。呼び出し側のアプリケーションは、保持している秘密鍵に基づいて署名を作成します。これにより、サーバは、彼らが(何らかの理由でも)と言っている人であることをサーバが検証できるようになります。また、ApiAuthenticationが組み込まれているのではなく、ヘッダーにユーザーのapiキーが含まれています。 最後の部分を変更して調べる必要があるかもしれません。 – tracstarr

関連する問題