Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/184.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Cookie或RESTful密钥的身份验证?_Android_Ruby On Rails_Web Services_Restful Authentication - Fatal编程技术网

Android Cookie或RESTful密钥的身份验证?

Android Cookie或RESTful密钥的身份验证?,android,ruby-on-rails,web-services,restful-authentication,Android,Ruby On Rails,Web Services,Restful Authentication,我花了大量时间研究如何最好地实现从Android应用程序到Rails web服务器的用户身份验证。我知道有一些引擎可以为我在Rails端进行身份验证,但我需要的不是很复杂,因此我认为最好还是编写自己的身份验证代码 我对RESTful web服务非常感兴趣:在无状态web服务器中,代码更具可读性、可维护性和可更改性,仅举几个优点。作为一名独立研究此实现的大学生,这些东西对我来说并不是非常重要,但我相信从编码的角度来看,REST引导的实现将是理想的 因为我的应用程序需要维护自己上下文的用户帐户,所以

我花了大量时间研究如何最好地实现从Android应用程序到Rails web服务器的用户身份验证。我知道有一些引擎可以为我在Rails端进行身份验证,但我需要的不是很复杂,因此我认为最好还是编写自己的身份验证代码

我对RESTful web服务非常感兴趣:在无状态web服务器中,代码更具可读性、可维护性和可更改性,仅举几个优点。作为一名独立研究此实现的大学生,这些东西对我来说并不是非常重要,但我相信从编码的角度来看,REST引导的实现将是理想的

因为我的应用程序需要维护自己上下文的用户帐户,所以在向Web服务器发出请求时,必须对用户进行身份验证。如果我以完全RESTful的方式实现这个应用程序,我不会维护任何类型的会话,而是要求Android应用程序(客户端)在每次请求时传递当前用户的凭据(可能是第一次登录时从web服务器返回给Android应用程序的唯一密钥)。这是一种有效的方法,但我担心这可能会在服务器端产生计算开销

原因如下:

  • 在每个请求上通过长字符串查找用户以便对该用户进行操作要比在CookieStore会话中为关联表行使用整数用户ID慢

  • 我可能不会在数据库中以纯文本形式存储RESTful身份验证密钥。我可能会使用BCrypt并存储密钥的salt和hash。这当然会导致此项目符号所解决的计算开销:在每个请求上使用BCrypt对接收到的密钥进行散列,以根据存储在数据库中的散列进行测试

当我最终需要为生产服务器托管时,我真的负担不起为一个野兽付费,只是为了我可以炫耀一个REST徽章

假设典型用户每天发出10-30个请求,并且用户数量取决于应用程序的受欢迎程度(我无法预测,但为了这个问题,假设为平均值),在我的特定情况下,RESTful实现身份验证是否可行?换句话说,它可能产生的计算开销是否会大幅增加服务器的硬件需求


谢谢

在我的项目中,我通常使用另一种方法

一旦用户登录到系统,我就向他发送一个唯一生成的密钥,其中包含混合的普通信息和加密信息

基本上我是这样做的:


key=User.id.to_s+SHA1::Digest.hexdigest(“#{SECRET_key}{User.id}{User.name}}{User.created_at.to_i}”)

因为SHA1散列的长度是已知的,所以可以从字符串中提取id和令牌,而不需要任何特殊的分隔符。 通过这种方式,您可以获得两个好处:

  • 不需要将密钥存储在数据库中,因为它可以根据需要进行计算
  • 返回给用户的密钥很短(网络优势)且易于发送(因为在ASCII中,不需要Base64或类似版本)

  • 希望这有帮助

    在我的项目中,我通常使用另一种方法

    一旦用户登录到系统,我就向他发送一个唯一生成的密钥,其中包含混合的普通信息和加密信息

    基本上我是这样做的:

    
    key=User.id.to_s+SHA1::Digest.hexdigest(“#{SECRET_key}{User.id}{User.name}}{User.created_at.to_i}”)
    

    因为SHA1散列的长度是已知的,所以可以从字符串中提取id和令牌,而不需要任何特殊的分隔符。 通过这种方式,您可以获得两个好处:

  • 不需要将密钥存储在数据库中,因为它可以根据需要进行计算
  • 返回给用户的密钥很短(网络优势)且易于发送(因为在ASCII中,不需要Base64或类似版本)
  • 希望这有帮助