API身份验证和OAuth2的使用

时间:2014-10-22 10:25:04

标签: ruby api authentication oauth sinatra

我正试图了解如何将基于令牌(基于密钥的?)身份验证引入到Web API(目前正在查看Sinatra,但也可能是Rails),这些将由移动客户端使用OAuth如何适应图片。

所以,假设我想创建一个使用Facebook进行身份验证和获取基本用户数据的Web服务。在这里,我的API将成为Facebook的OAuth服务器的客户端,在用户成功登录Facebook时请求访问令牌。然后,这将授予我访问用户数据的权限,我将使用该数据在我的数据库中创建一个条目,将此用户特定的令牌与我想要链接到的任何其他应用程序信息一起存储。

我认为到目前为止我已经掌握了这一部分,但这里我有点困惑。

我认为我的API还需要某种形式的API密钥来授予移动用户访问权限,因为我不想在他们的设备上传输和存储Facebook密钥。我是否必须有一个单独的密钥存储区,我提供给客户端来访问我的服务?这样做有“最佳实践”方法吗?

1 个答案:

答案 0 :(得分:2)

我是否必须有一个单独的密钥存储区,我提供给客户端以访问我的服务?

有没有'最佳实践'的方法呢?

最简单的方法是在每次创建用户时生成单独的身份验证令牌,并将其公开给移动客户端。然后将其与每个后续请求标头一起发送。

Devise提供了simple example如何实现这一目标。你不需要设计,只需提供一些令牌生成机制。

#Devise.friendly_token
def self.friendly_token
  SecureRandom.urlsafe_base64(15).tr('lIO0', 'sxyz')
end

可以扩展此机制以通过以下方式提供更高的安全性

  1. 成为oauth2提供商。 成功登录Facebook后,您将生成:authorization_code,客户端可以在下一步中交换您自己的Oauth2承载或MAC令牌。然后,您可以在每次用户身份验证请求时发送自己的Oauth2令牌。 请参阅rack-oauth2

  2. 实施HMAC令牌加密。 在唱歌后为每个客户端生成并公开一个secret_key。使用此秘密来签署消息以及唯一的客户端ID。然后,服务器可以查找特定client_id的secret_key并验证该消息 请参阅api-auth