[解決済み] モバイルアプリにおけるOAuthの秘密
質問
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
関連
-
[解決済み] モバイル端末の検出にはどのような方法がありますか?
-
[解決済み] 後で平文を取り出すためのユーザーパスワードの保管について、倫理的にどのように取り組むべきでしょうか?
-
[解決済み] OpenIDとOAuthの違いは何ですか?
-
[解決済み] 認証とセッション管理に関するSPAのベストプラクティス
-
[解決済み] UIViewの下に影を描くには?
-
[解決済み】OAuth v2には、なぜアクセス・トークンとリフレッシュ・トークンの両方があるのでしょうか?
-
[解決済み] iPhone Safari ウェブアプリでリンクを新しいウィンドウで開く
-
[解決済み] iPhoneのSafariで<body>に適用したoverflow:hiddenは機能するのか?
-
[解決済み] cocoaアプリケーションのinfo plistにある「bundle display name」と「bundle name」の違いは何ですか?
-
[解決済み] AppDelegate.mで画面上に現在表示されているUIViewControllerを取得する。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] UIScrollViewでスクロールの方向を見つける?
-
[解決済み] APNSの.pemファイルを作成する?
-
[解決済み] iPhoneのシミュレータに.ipaファイルをインストールする方法は?
-
[解決済み] iOS UITableViewのHeaderView(セクションヘッダーではない)を追加する
-
[解決済み] iPhone UIViewアニメーションのベストプラクティス
-
[解決済み] position: iPadとiPhoneで固定が効かない。
-
[解決済み] オプションのメソッドを持つプロトコルを作成するには?
-
[解決済み] AppDelegate.mで画面上に現在表示されているUIViewControllerを取得する。
-
[解決済み] iPhoneでテキスト入力のポップアップダイアログボックスを表示する簡単な方法は?
-
[解決済み] モバイルSafariで:active擬似クラスが機能しない