1. ホーム
  2. iphone

[解決済み] モバイルアプリにおけるOAuthの秘密

2022-05-25 21:42:22

質問

OAuthプロトコルを使用する場合、デリゲートしたいサービスから取得した秘密文字列が必要です。Web アプリでこれを行う場合、秘密は単にデータベースまたはファイル システムに格納できますが、モバイル アプリ (またはデスクトップ アプリ) でこれを処理する最良の方法は何でしょうか?

アプリに文字列を保存することは、誰かが簡単にそれを見つけて悪用できるため、明らかによくありません。

もう 1 つの方法は、サーバーに保存して、アプリが実行のたびにそれを取得し、携帯電話には保存しないようにすることです。これは、アプリに URL を含めなければならないので、ほとんど悪いことです。

私が思いつく唯一の実行可能なソリューションは、最初に通常のようにアクセストークンを取得し (できればアプリ内の Web ビューを使用)、次に、それ以降のすべての通信をサーバー経由で行い、サーバーがリクエスト データに秘密を追加してプロバイダーに通信することです。私はセキュリティに疎いので、この件に関して知識のある方々のご意見をお伺いしたいと思います。ほとんどのアプリがセキュリティを保証するためにここまでしているとは思えません (たとえば、Facebook Connect は、アプリ内で文字列に秘密を入れることを想定しているようです)。

もうひとつ、最初にアクセストークンを要求する際に秘密が関与するとは思えないので、独自のサーバーを介さずに行うことができます。私は正しいですか?

どのように解決するのですか?

はい、これは私たち自身が直面している OAuth の設計に関する問題です。私たちは、すべての呼び出しを独自のサーバーを介してプロキシすることを選択しました。OAuth は、デスクトップ アプリに関して完全にフラッシュされていませんでした。OAuth を変更せずに、私が見つけたこの問題に対する完璧な解決策はありません。

なぜ私たちが秘密を持っているのかという疑問について考えてみると、ほとんどの場合、アプリを提供したり無効にしたりするためです。秘密が漏えいした場合、プロバイダーはアプリ全体を無効にすることしかできません。デスクトップ アプリに秘密を埋め込む必要があるため、ちょっと困ったことになります。

解決策は、各デスクトップ アプリに異なる秘密を持つことです。OAuth では、このコンセプトは簡単ではありません。1 つの方法は、ユーザーが自分で秘密を作成し、そのキーをデスクトップ アプリに入力することです (一部の facebook アプリでは、長い間、同様のことを行っていました。ユーザーは facebook を作成して、カスタム クイズやくだらないものを設定する必要がありました)。これはユーザーにとって良い経験ではありません。

私は、OAuthのための委任システムの提案に取り組んでいます。コンセプトは、プロバイダーから取得した独自の秘密鍵を使用して、独自のデスクトップ クライアント (基本的に各デスクトップ アプリに 1 つ) に委任された秘密を発行し、認証プロセス中にその鍵をトップレベルのプロバイダーに送信して、プロバイダーにコールバックして再認証させるというものです。そうすることで、各デスクトップに発行した独自の機密を取り消すことができます。(この仕組みは、SSLから多くを拝借しています)。このシステム全体は、サードパーティの Web サービスへの呼び出しを渡す付加価値の高い Web サービスにも最適でしょう。

トップレベルのプロバイダーが新しい委任された秘密を生成し、取り消すためのAPIを提供する場合、このプロセスは委任の検証コールバックなしで行うこともできます。Facebookは、ユーザーがサブアプリを作成することをFacebookアプリに許可することで、似たようなことを行っています。

この問題については、オンラインでもいくつかの議論があります。

http://blog.atebits.com/2009/02/fixing-oauth/ http://groups.google.com/group/twitter-development-talk/browse_thread/thread/629b03475a3d78a1/de1071bf4b820c14#de1071bf4b820c14

TwitterとYammerのソリューションは、認証ピンのソリューションです。 https://dev.twitter.com/oauth/pin-based https://www.yammer.com/api_oauth_security_addendum.html