2017-01-10 49 views
0

如何让我的Rails 5 API只使用密钥对模式工作?我可以不考虑智威汤逊的,因为这些要求Rails 5 API密钥对设计模式

我想:使用API​​

  • 安全地验证没有用户名/密码的资源所有权

    • 跟踪的应用程序。

    我能想到这个过程:

    • 用户在我们的web应用程序创建新的应用程序。
    • 系统生成安全公钥(应用程序标识符)和私钥
    • 只要用户可以提交HTTP请求,用户就可以使用密钥对将API与其应用程序集成为不同的语言。
    • 服务器将验证它们的密钥对并作出相应的响应。

    我的问题:

    • 是否有任何宝石来处理密钥对生成? (仅供参考)
    • 我宁愿自己生成密钥对,而不愿使用宝石。什么算法最适合我的要求?
    • 我应该过期密钥对吗?
  • +0

    导轨5附带['has_secure_token'](http://api.rubyonrails.org/classes/ActiveRecord/SecureToken/ClassMethods.html),可以用它来生成令牌。过期取决于您的应用程序和用户体验。 – AbM

    +0

    这种东西是否足够安全地用于私钥? – ln9187

    回答

    3
    • 是否有任何宝石来处理密钥对生成? (仅供参考)

      您可以创建一个表来自己做映射。他们

      ------------------------- 
      | id   | INT  | 
      ------------------------- 
      | public_key | VARCHAR | 
      ------------------------- 
      | private_key | VARCHAR | 
      ------------------------- 
      | user_id  | INT  | 
      ------------------------- 
      
    • 我宁愿生成的组合创建唯一约束的密钥对我自己,而不是使用 宝石。什么算法最适合我的要求?

      不推荐。即使你可以做得比一个经过验证的宝石更好(不太可能),但除非你有一个非常好的理由,否则它不值得花时间,或者在所有宝石中都有根本的缺陷,并且会在你的用例中造成问题。但是,如果你确实想要,你可以利用像MD5Murmurhash这样的快速散列算法,并且建立在它们之上。

      您可以简单地使用SecureRandom已与红宝石已发货。示例用例:

      SecureRandom.uuid #=> "2d931510-d99f-494a-8c67-87feb05e1594" 
      
    • 我应该过期密钥对吗?

      这取决于您的密钥对的使用方式。如果你的用户依靠这个密钥来打电话给你的应用,那么很可能不会。想象一下,您的应用取决于Google的API,并且有一天,Google会失去您的密钥,并且您的所有API调用都将返回403.哎呀......但您希望让用户选择撤销并重新生成它们。

      很好的例子是Facebook,谷歌,甚至像Stripe这样的支付服务,Braintree不会过期你的密钥对,除非你撤消它。

      或者如果您确实想过期,您应该提供刷新机制。你可以看看Uber's oauth API

    • 我是否需要安全生成应用程序ID(我称为公钥)?它可以是随机的吗?

      所以我想你公私钥对的含义不是this。如果不是,你首先需要知道你要暴露什么端点。

      如果您的用户只会从服务器端访问您的API端点,那么您只需要一个密钥。然后,您可以简单地通过密钥查找用户,然后确认身份。在大多数情况下,这是你需要的。

      如果您的用户还需要从前端(例如谷歌地址验证API,stripe的信用卡验证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