2016-09-06 3 views
1

クライアント用のクォータが必要なREST APIを作成しています。私は非常に単純なOAuth 2のメカニズムを使用しています。ここでは、認証サーバーを使用してクライアントIDと秘密からベアラトークンを取得し、トークンが期限切れになるまで使用します。Android/iOS/Windowsデバイス用のREST認証

アプリケーションには、ユーザーとパスワードでログインし、ユーザー固有の新しいアクセストークンを受け取るユーザーログインがあります。ユーザーは、ユーザー名とパスワードで再度取得できます。

問題は、クライアントIDとシークレットが新しい開発者がサービスにAPIを統合できるように、たとえば分あたり10要求のクォータを持つという点です。だから私は無制限のクォータを持つ特別なIDを作成し、コード内の定数として設定することができます(これは悪い考えです。逆コンパイルで誰でもその秘密を使用できるようになります)か、デバイスごとのID秘密。

私はAndroidデバイスID(Androidの場合)を使ってそれを特定しようと考えていましたが、64ビットの数字をたくさん作成して登録しようとしないでください。 AndroidデバイスIDを検証するサービスはありますか?これは他のプラットフォームでどのように行われますか?

これは正しい方法ですか?メカニズムの一部を変更する必要がありますか? Twitterはどうしていますか?私はそれがAPIへの完全なアクセス権を持っていることを知っていますが、他の開発者はクライアントIDと秘密が必要です。

答えて

0

クライアント上でのみ生成される値は、改ざんされる可能性があり、信頼されるべきではありません。単純なアプリケーションでもIPアドレスを偽装することができます。

あなたは解決策として、JWT'sを考えましたか?基本的にJWTをクライアントに発行します。これらのJWTには、クライアント/ユーザーを識別するUUIDv4という一意の識別子が含まれています。これにより、資格情報を発行する際に偽造のケースが削除されます。

Auth0では、テナントごとに、およびユーザー/デバイスごとにエンドポイントへのAPI呼び出しを制限する同様の要件がありました。これは、limitdとなりました。基本的に、レート制限ロジックをアプリケーションロジックから切り離すサービスソリューションとしてのレート制限です。

システムは、複数のバケットを作成し、それぞれのバケットからトークンを要求することによって動作します。これは、テナント、IP、ユーザーベースの別の制限を実装した方法です。

+0

クライアントはどのようにトークンを要求しますか?公式アプリを使用していない他のクライアントがトークンを要求しないようにするにはどうすればよいですか? – Razican

+0

ユーザーIDとクライアントID。 (Webviewで実行されている場合、またはWebアプリケーションの場合は、Originを使用してCORS制限を適用できますが、ネイティブクライアントは依然としてリクエストを行うことができます)。 – ShrekOverflow

+0

しかし、ネイティブアプリが認証サーバーにトークンリクエストを送信すると、いくつかのHTTPヘッダーが提供されます。別のクライアントが同じHTTPヘッダーを送信しないようにするにはどうすればよいでしょうか? – Razican