2012-01-08 15 views
0

私は、承認されたクライアントアプリケーション(iOS/Android用のモバイルアプリケーション)によって消費されるAPIを公開するRailsアプリケーションを作成したいと考えています。私はまだアプリケーションの作業を開始していないが、基本的なデータにアクセスするための主要な方法は、APIを介して行われます。 grape gemを使用してみましたが、認証レイヤーを追加する必要があります。私はdeviseを使用し、クライアントの詳細、apiキーと秘密鍵を格納するための別のモデルを追加することを考えていました。 apiを介してサインインすると、APIキーと秘密が返されます。 APIキーはリクエストごとに送信されますが、秘密キーは送信されません。代わりに、各要求に署名するために使用されます。リクエストパラメータは、名前順に並べられ、ハッシュキーとして秘密キーを使用してハッシュされます。この署名は、要求のパラメータとして追加されます。Rails API認証 - サニティチェックとアドバイス

この認証システムは論理的で安全ですか?

システムのプロトタイプを先に試してみましたが、devonを使用してJSONを使用してユーザーを登録するのが難しくなりました。最初はCSRFエラーが発生しました。私はprotect_from_forgeryをオフにして別のエラーが発生しました。私がこのように認証しているなら、これをオフにしても安全ですか?

答えて

0

protect_from_forgeryは、HTMLフォームを保護するのに役立ちます。モバイルクライアントからJSONを使用している場合は、その必要はありません。

  • クライアントは、その後にこのキーを埋め込む「APIキーを生成する(再)」ユーザーのアカウントページで

    • 、というボタンがあります。ここでは

      は私があなただったら、私はどうなるのかです彼の呼び出しコードと各要求に合格する。

    • APIサーバーは、このAPIキーをこのクライアントIDで使用できるかどうかを確認します。

    実装が非常に簡単で、うまく機能します。

    署名パラメータも機能し、成功したいくつかのプロジェクトで使用しました。しかし、実際の利益を得ることなくコードの複雑さが増します(秘密鍵はクライアントにあり、攻撃者はすでにそれを知っています)。

  • +0

    署名なしでは、クライアントとサーバーの中間にいる誰もが鍵を盗聴できます。したがって、クリアテキストでAPIキーを渡すだけでは不十分です。私はむしろ、攻撃者が要求からそれを得ることができるよりも鍵を得るために私のモバイルアプリを分解しなければならない。 – ctcherry

    +0

    @ctcherry:それは本当です。しかし、あなたのアプリがハッキングの価値があるなら、とにかくそれをやります。私は個人的にはほとんど違いが見えません。 –

    +0

    私のアプリケーションは、ほとんどの人にハッキングする価値はありませんが、開発者として私の意見では、最良の(妥当な)慣行でユーザーを保護するために最善を尽くすことが私たちの責任です。ほとんどのクラッカーがそれをどうにかして取得することに興味がなくても、プレーンテキストでパスワードを保存しないのと同じ理由です。 – ctcherry

    1

    はい、日付またはタイムスタンプが常に署名されているパラメータの内側にある限り、別の認証方法を使用しているので、CSRF保護を無効にすることができます。これを使用して、要求時間とサーバー時間を比較し、再生攻撃を受けていないことを確認できます。