【发布时间】:2016-04-21 11:54:21
【问题描述】:
我正在使用 Ruby on Rails 为 iOS 应用程序和 Web 应用程序(即可以从移动应用程序或 Web 前端创建用户)编写用户创建系统。我对使用像 Devise 这样的系统不感兴趣。
我已经有几年没有这样做了,所以只是想确保我的想法是最新的并且有意义。
步骤/假设
- 我们将通过自定义 HTTP 字段(例如“X-auth_token”)管理服务器和客户端之间的状态。
- 它们可以通过电子邮件/密码凭证或通过 facebook 创建。
在邮件登录的情况下,用户只会发布以下json:
{
user:{
email:'joe@test.com',
password:'testpassword',
}
}
我将使用 Rails has_secure_password 对值进行哈希处理。
并且会返回
{
user:{
id:23,
auth_token:'md5value',
}
}
对于网络,我们将 auth_token 作为 cookie 值传递。对于 iOS 应用,auth_token 将作为自定义 HTTP 标头字段传递,例如“X-auth_token”
- 在Facebook登录的情况下,他们将使用FacebookSDK,从FB获取范围权限,然后发布
{
user: {
is_facebook_login: true,
fb_email: 'joe@test.com',
fb_auth_token: 'abigvaluefromFB'
}
}
在服务器上,我们将确保他们通过以下方式传递有效的 fb_auth_token 凭据 用
调用 facebookdef self.verify_facebook fb_auth_token
result = Net::HTTP.get(URI.parse("https://graph.facebook.com/me?access_token=#{fb_auth_token}"))
obj=JSON.parse(result)
obj["email"]
end
并验证初始请求中发送的 fb_email 是否与 facebook 提供的电子邮件相对应。
以下是相应图表的步骤:
步骤
- 对 facebook 的 oauth 请求,仅请求电子邮件
- 用户批准,电子邮件和身份验证令牌返回
- 发送 auth_token 到我们的服务器;如果是 facebook auth'd 客户端,请设置标志,以便只能通过 facebook 登录
- 通过 facebook 验证令牌是否准确
现在不担心,如果他们更改他们的 Facebook 电子邮件,那么运气不好。如果他们通过 Facebook 登录,然后想通过电子邮件/密码登录,那么运气不好。
在我们这一端,我们将生成一个 auth_token(一个 MD5 字符串),并将其发送回现在管理身份验证的客户端。从那时起,我们将发送一个自定义 HTTP 标头 X-auth_token
我们会回复
{
user:{
id:23,
auth_token:'md5value',
}
}
iOS 应用会通过https://github.com/kishikawakatsumi/KeychainAccess 将 auth_token 写入钥匙串
上述场景对于用户创建是否合理?
【问题讨论】:
-
您不会获得每个用户的电子邮件地址。他们可能不会授予您的应用权限,或者他们可能没有在 Facebook 存档的经过验证的电子邮件地址,例如如果他们使用自己的手机注册(这很可能是 iOS 用户的份额)。
-
谢谢@CBroe - 我会调查这个问题;我想这就是为什么这么多 iOS 应用程序即使在我通过 FB auth 提供电子邮件后仍要求电子邮件的原因。似乎是一种痛苦的 UI 体验。
标签: ios facebook authentication