tim*_*one 16 authentication facebook ios
我正在使用Ruby on Rails为iOS应用程序和Web应用程序(即可以从移动应用程序或Web前端创建用户)编写用户创建系统.我对使用像Devise这样的系统不感兴趣.
我在几年内没有这样做,所以只是想确保我的想法是最新的并且有意义.
步骤/假设
在电子邮件登录的情况下,用户将发布以下json:
{
user:{
email:'joe@test.com',
password:'testpassword',
}
}
Run Code Online (Sandbox Code Playgroud)
我将使用Rails has_secure_password来散列值.
并将返回
{
user:{
id:23,
auth_token:'md5value',
}
}
Run Code Online (Sandbox Code Playgroud)
对于web,我们将auth_token作为cookie值传递.对于iOS应用程序,auth_token将作为自定义HTTP标头字段传递,例如"X-auth_token"
{
user: {
is_facebook_login: true,
fb_email: 'joe@test.com',
fb_auth_token: 'abigvaluefromFB'
}
}
在服务器上,我们将通过调用facebook来确保他们传递有效的fb_auth_token凭据
def 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
Run Code Online (Sandbox Code Playgroud)
并验证初始请求中发送的fb_email是否与Facebook提供的电子邮件相对应.
这是带有相应图表的步骤:
脚步
现在不担心,如果他们改变他们的Facebook电子邮件,运气不好.如果他们通过Facebook登录然后想通过电子邮件/密码登录,那就太难了.
在我们的最后,我们将生成一个auth_token(一个MD5字符串),并将其发送回现在管理身份验证的客户端.从那时起,我们将发送自定义HTTP标头X-auth_token
我们会回复
{
user:{
id:23,
auth_token:'md5value',
}
}
Run Code Online (Sandbox Code Playgroud)
iOS应用程序将通过https://github.com/kishikawakatsumi/KeychainAccess将auth_token写入钥匙串
上述场景对于用户创建是否合理?
您描述的所有想法对我都有效,但整个描述看起来不完整.
缺少的部分是:
您已经有两个流程的描述 - 通过电子邮件进行新用户注册以及通过Facebook进行新用户注册.
在服务器上我会像这样存储它们,users
表:
我也会在这样的场景中合并email/facebook用户:
如果用户更改了他的Facebook电子邮件 - 这不会破坏任何内容,我们可以忽略此更改,如果我们已经在users
表中有电子邮件.因此,用户仍然可以使用他的旧电子邮件登录.(或者,使用其他登录历史记录,我们可以检查用户是否从未使用电子邮件登录并将其替换为新电子邮件).
generate password
为Facebook用户提供功能也很容易.他们可以在登录时输入电子邮件并生成密码,这样他们以后也可以使用电子邮件/密码登录.
您还可以添加forgot password
可以生成新密码并将其发送到用户电子邮件的功能 - email
用户和facebook
提供该电子邮件的用户都可以使用该功能.
如果我的想法正确,您希望有一个统一的方法来创建新用户和验证现有用户,如下所示:
对于facebook来说类似,但是我们检查facebook_id而不是电子邮件/密码,并通过对facebook的请求进行验证.
您还可以考虑使用单独的后端端点 - 一个用于注册新用户,另一个用于登录现有用户.因为通过上述过程,如果用户错误输入了他的电子邮件,您将创建一个不期望的新用户.对于Facebook注册/登录可能没有太大的区别.
我假设允许一个用户有多个auth令牌从不同位置登录是有用的,所以这是tokens
表:
常规请求如下所示:
令牌过期可以这样完成:
now() - token.created_at > EXPIRATION_PERIOD
token.expired
= True + save)