2011-12-05 6 views
3

現在、新しいAPIを保護し、必要な機能を安全に提供する方法が不明なOAuth2を実装中です。私たちは、モバイルデバイスから次許可する必要があります。すぐにユーザーが写真を撮ると、最初のログにせずにそれを提出することができ、アプリをダウンロードした後OAuth2を使用してモバイルアクセスを安全に認証するオプション

我々はしたいものの特定の機能を使用するためにログインまたは登録する必要がない匿名ユーザーのアクセスを許可するため、APIへの認証されていないアクセスを許可したくありません。これは通常、client credentials authorization flowを使用して達成され、アプリケーションアクセストークンを取得しますが、これにはクライアントの秘密を知る必要があります。私が読んだところでは、モバイルデバイスは信頼できるクライアントとはみなされず、クライアントシークレットを含むべきではないため、独自のアプリケーションアクセストークンを生成できません。

私たちは、この要件を達成するためにいくつかのオプションを作ってみたが、それらのいくつかの入力をしたいと思います:

  1. は、アプリ内のクライアント秘密を埋め込みます。セキュリティの観点からは理想的ではないようですが、セキュリティを確保するための明白な方法がないのでしょうか?私たちは少なくともiOSとAndroidをターゲットにしています。
  2. アプリのアクセストークンをオフラインで生成し、アプリに埋め込みます。まだあまり安全ではありませんが、少なくとも秘密は公開されていません。
  3. アクセストークンではなくクライアントIDのみを使用して、特定の機能にアクセスできるようにします。これは最も簡単かもしれませんが、矛盾が生じ、クライアントの認証方法が複数必要です。
  4. コンパニオンウェブアプリを構築して使用して、モバイルアプリのアプリアクセストークンを生成します。表面は勝者のようですが、コンパニオンアプリへのアクセスを確保する必要があります。

モバイルデバイスからOAuth2を使用して初めてユーザーがログインすることなく、APIへのアクセスを安全に認証しますか?

+0

?匿名アクセスが指定されているため、ユーザーを認証しようとしていません。あなたはクライアントアプリケーションを認証しようとしていますか?暗号化された接続を介して通信しようとしていますか? 「セキュア」はやや曖昧です。 – Fantius

+0

「安全な」という言葉が最良の用語ではないかもしれません。私たちが望んでいないのは、APIへの匿名アクセスです。リクエストを出しているアプリを知りたいのです。私たちが望むのは、ユーザーがログインする必要がなくてもアプリケーションがリクエストを行うことができるようにすることです。質問を明確にしようと更新します。 –

+0

その後、アプリには他に何もない秘密が必要です。これが唯一の方法です。何かがその秘密を取得した場合、それはアプリを偽装することができます。 – Fantius

答えて

2

Q.どちらかのコメントに同意します:

1)は、クライアントの資格情報を使用してOAuthの2タイプを許可 - あなたのアプリケーションに埋め込まれた秘密と。これは超安全ではなく、誰かがそれを最終的にリバースエンジニアリングすることを理解する。理想的には、それぞれのクライアントは一意の秘密を得るでしょう。そのため、クライアントがその使用を乱用している場合、クライアントを取り消すことができます。

2.)そのAPIが公開されているため、OAuth 2アクセストークンをまったく必要としません。おそらくそのAPIはあなたのアプリだけにしか知られていないかもしれませんが、逆にそれをリバースエンジニアリングするまでには時間がかかるでしょう。

+0

アプリのアクセストークンを埋め込むのは、アプリの秘密を埋め込むよりもわずかに優れているようですね。認証なしでAPIを開いたままにすることは選択肢ではありません。誰がAPIを使用しているかを知る必要があります。 –

+0

アクセストークンは通常、(時間に基づいて)短命です。ユーザーがインストールした後、またはログインする前にこのAPIをX /分だけ許可することを考えていますか?そうでない場合は、「更新トークン」を意味する可能性があります。これはより長く存続し(通常はユーザーが取り消したものです)、アクセストークンと交換することができます。私があなただったら、可能な場合は独自のclient_id/client_secretをアプ​​リに埋め込み、これらのクライアントがこの特定のAPIを呼び出すようにしてください(つまり、そのOAuthスコープでのみこの操作が許可されます)。これらのクライアント・サーバー側の濫用/取り消しを監視する手段があることを確認してください。 –

+0

HTTPS対応のインスペクタがクライアントIDと秘密を即座に明らかにすることはできましたが、オプション1になりました。秘密が絶対に秘密に保持されなければならない場合は、OAuth 2は行く方法ではありません。 –

2

私のグループも同様の議論があります。ユーザーは、サインインしなくてもアプリを入手してカタログを閲覧することができます。カタログやその他のデータにはAPIを介してアクセスし、すべての呼び出しに対してユーザーにaccess_tokenを強制します。

私たちの現在の考え方は常にaccess_tokenはのための共通のclientId /秘密を交換するアプリケーションを強制

  • にあります。だから、匿名ユーザーであっても、このアプリケーションはaccess_tokenを取得します。これは、client_credentials oAuthフローを介して行われます。
  • ユーザーがサインインする場合は、oAuthパスワードフローを使用します。彼らは、clientId、シークレット、ユーザー名、およびパスワードを渡します。さらに、匿名トークンを渡して、匿名セッションから履歴を転送できるようにします。ですから、例えば

...

access_token = api.oAuth.client_credentials(clientId, secret) 
catalog = api.getCatalog(access_token) 
authenticated_access_token = api.oAuth.password(clientId, secret, username, password, access_token) 
正確にあなたが "安全な" しようとしている何
関連する問題