API身份验证和OAuth2的使用

问题描述:

我试图让我的头脑如何将基于令牌的(基于密钥的)身份验证引入Web API(目前正在查看Sinatra,但也许是Rails),这将是由移动客户端使用以及OAuth如何适合图片。API身份验证和OAuth2的使用

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

我想我到目前为止有这部分权利,但这里是我有点困惑。

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

我需要单独存储一些密钥吗?我提供给客户来访问我的服务?

是的。

有没有这样做的最佳做法?

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

设计提供了一个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