2017-01-10 10 views
0

Rails 5 APIのみキーペアパターンで動作させるにはどうすればよいですか?私は私がしたいので、これらの要件のRails 5 APIキーペアデザインパターン

をJWTを考慮することはできません。

  • しっかりユーザ名/パスワードを入力せずにリソースの所有権を確認するAPI
  • を使用してアプリケーションを追跡します。

私は、このプロセスを考えることができます:

  • ユーザーは、当社のWebアプリケーションに新しいアプリを作成します。
  • システムは安全な公開鍵(アプリ識別子)と秘密鍵を生成します
  • ユーザーは、HTTP要求を送信できる限り、キーペアを使用してさまざまな言語のAPIをアプリケーションと統合できます。
  • サーバーは鍵ペアを検証し、それに応じて応答します。

私の質問:

  • 鍵ペアの生成を処理するために、任意の宝石はありますか? (参照用)
  • 私は、宝石を使用するのではなく、自分自身で鍵ペアを生成したいと考えています。私の要件に最も適したアルゴリズムは何ですか?
  • キーペアを期限切れにする必要がありますか?
+0

Railsのあなたはトークンを生成するために使用することができます[ 'has_secure_token'](http://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html)と5隻の船。有効期限は、アプリケーションとユーザーエクスペリエンスによって異なります。 – AbM

+0

プライベートキー用に十分なセキュリティが確保されていますか? – ln9187

答えて

3
  • 鍵ペアの生成を処理するために、任意の宝石はありますか? (参照用)

    自分でマッピングを行うためのテーブルを作成することができます。私はむしろ 宝石を使用するよりもキーペアを自分自身を生成することを好むそれらの組み合わせ

    ------------------------- 
    | id   | INT  | 
    ------------------------- 
    | public_key | VARCHAR | 
    ------------------------- 
    | private_key | VARCHAR | 
    ------------------------- 
    | user_id  | INT  | 
    ------------------------- 
    
  • 上で一意制約を作成します。私の要件に最も適したアルゴリズムは何ですか?

    推奨しません。あなたが実績のある宝石よりも優れた仕事をしても(本当らしいとは限りませんが)、本当に本当に良い理由がないか、すべての宝石に根本的な欠陥があり、ユースケースに問題を引き起こさない限り、時間の価値はありません。しかし、あなたがしたい場合は、MD5またはMurmurhashのような高速のハッシュアルゴリズムを利用し、それらの上に構築することができます。

    あなたは既にrubyに同梱されているSecureRandomを使うことができます。使用例:

    SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" 
    
  • キーペアを期限切れにする必要がありますか?

    これは、キーペアの使用方法によって異なります。あなたのユーザーがキーに依存して、あなたのアプリへのAPIコールを行う場合は、あなたのアプリがGoogleのAPIに依存しているとしたら、ある日、どこかでGoogleがあなたのキーを期限切れにしてしまい、すべてのAPI呼び出しが403を返します。whoops ...しかし、ユーザーにそれらを取り消して再生成するオプションを与えたいとします。

    Facebook、Google、Stripe、Braintreeなどの支払いサービスでさえも、あなたがそれを取り消さない限り、あなたのキーペアの有効期限は切れません。

    また、期限切れにしたい場合は、リフレッシュメカニズムを提供する必要があります。あなたはUber's oauth APIを見ることができます。

  • アプリIDを安全に生成する必要がありますか(私は公開鍵を呼び出します)?それはちょうどランダムなことができますか?

    公開鍵と秘密鍵のペアが意味するものは、thisではありません。そうでない場合は、まず、どのエンドポイントを公開するのかを知る必要があります。

    ユーザーがサーバー側からのみAPIエンドポイントにアクセスする場合は、1つの秘密キーが必要です。次に、秘密鍵でユーザを探し、アイデンティティを確認するだけです。ほとんどの場合、これが必要なものです。

    フロントエンドからのリクエスト(Googleの住所確認API、ストライプのクレジットカード確認APIなど)が必要な場合は、公開キーが必要です(フロントエンドのコードベースになるため)。これで、あなたはあなたが戻ってくるものにもっと注意する必要があります。経験則として、情報が(ストライプのような)機密情報である場合、クライアント固有のものを返すことが望まれます。たとえば、クレジットカードを検証してカードトークンを返すとします。トークンは、特定のクライアントに対して一意である必要があります。下記参照。同じクレジットカードであっても、別のトークンを返します。クライアントが実際にクレジットカードの請求を要求すると、秘密鍵を使用してクライアントを探し、カードトークンと一致させます。

     publishable_keys      credit_card_tokens 
    ----------------------------------------- ---------------------------------------- 
    | publishable_key | secret_key | app_id | | app_id | card_token | credit_card_id | 
    ----------------------------------------- ---------------------------------------- 
    | public_12345 | private_12 | 1 | | 1 | cc_1233 |  1  | 
    ----------------------------------------- ---------------------------------------- 
    | public_23456 | private_23 | 2 | | 2 | cc_2344 |  1  | 
    ----------------------------------------- ---------------------------------------- 
    
+0

秘密鍵に理想的なbase64音の 'SecureRandom'があります。アプリIDを安全に生成する必要がありますか(私は公開鍵と呼んでいます)? – ln9187

+0

@ ln9187あなたがアプリIDを安全に生成することによってどのような意味があるのか​​よくわかりません。あなたは明確にすることができますか? –

+0

安全な秘密鍵(private_key)が必要であることは確かですが、public_keyはどうすれば単なるランダムになりますか? – ln9187