Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/9.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
Ios 为使用电子邮件和facebook\u id的web和移动设备创建用户创建/验证系统_Ios_Facebook_Authentication - Fatal编程技术网

Ios 为使用电子邮件和facebook\u id的web和移动设备创建用户创建/验证系统

Ios 为使用电子邮件和facebook\u id的web和移动设备创建用户创建/验证系统,ios,facebook,authentication,Ios,Facebook,Authentication,我正在使用RubyonRails为iOS应用程序和web应用程序(即用户可以从移动应用程序或web前端创建)编写一个用户创建系统。我对使用像Desive这样的系统不感兴趣 我已经好几年没有这样做了,所以我只想确保我的想法是最新的,有意义的 步骤/假设 我们将通过自定义HTTP字段(如“X-auth_令牌”)管理服务器和客户端之间的状态 它们可以通过电子邮件/密码凭据或facebook创建 在电子邮件登录的情况下,用户只需发布以下json: { user:{ email:'joe@te

我正在使用RubyonRails为iOS应用程序和web应用程序(即用户可以从移动应用程序或web前端创建)编写一个用户创建系统。我对使用像Desive这样的系统不感兴趣

我已经好几年没有这样做了,所以我只想确保我的想法是最新的,有意义的

步骤/假设

  • 我们将通过自定义HTTP字段(如“X-auth_令牌”)管理服务器和客户端之间的状态
  • 它们可以通过电子邮件/密码凭据或facebook创建 在电子邮件登录的情况下,用户只需发布以下json:

    {
      user:{
        email:'joe@test.com',
        password:'testpassword',
      }
    }
    
    我将使用Rails has_secure_password来散列这些值

    而且还会回来

    {
      user:{
        id:23,
        auth_token:'md5value',
      }
    }
    
    对于web,我们将把auth_令牌作为cookie值传递。对于iOS应用程序,auth_令牌将作为自定义HTTP头字段传递,例如“X-auth_令牌”

  • 在facebook登录的情况下,他们将使用FacebookSDK,从FB获得范围权限,然后发布
  • 
    {
    用户:{
    facebook登录:对吗,
    fb_电子邮件:'joe@test.com',
    fb_auth_标记:“AbigValue FromFB”
    }
    }
    

    在服务器上,我们将确保他们通过 给facebook打电话

    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 
    
    以及验证初始请求中发送的fb_电子邮件是否与facebook提供的电子邮件相对应

    以下是带有相应图表的步骤:

    台阶

  • oauth请求facebook,仅请求电子邮件
  • 用户批准、电子邮件和身份验证令牌返回
  • 向我们的服务器发送auth_令牌;如果facebook授权了客户端,请设置标志,使其只能通过facebook登录
  • 通过facebook验证令牌是否准确
  • 现在不担心,如果他们改变他们的facebook电子邮件,那真是倒霉。如果他们通过Facebook登录,然后想通过电子邮件/pwd登录,那真是倒霉

    最后,我们将生成一个auth_令牌(MD5字符串),并将其发送回现在管理身份验证的客户端。从那时起,我们将发送一个自定义HTTP头X-auth_令牌

    我们将作出回应

    {
      user:{
        id:23,
        auth_token:'md5value',
      }
    }
    
    iOS应用程序将通过将auth_令牌写入密钥链


    上述场景对于用户创建是否合理

    你描述的所有想法对我来说都是有效的,但整个描述看起来不完整

    缺失的部分包括:

    • 您如何存储和识别用户
    • 如何存储身份验证令牌
    • 一个用户可以有多个令牌吗
    • 您想让旧代币过期吗
    您已经描述了两个过程:通过电子邮件注册新用户和通过facebook注册新用户

    在服务器上,我会像这样存储它们,
    users
    table:

    • ID—应用程序数据库中唯一的整数用户ID
    • 电子邮件-字符串,可选(facebook可能不存在),表中唯一
    • facebook_id-字符串,可选(对于通过电子邮件注册的用户将不存在),在表中唯一
    • 密码-字符串,可选(facebook用户无密码)
    我也会在这样的场景中合并电子邮件/facebook用户:

    • 用户通过电子邮件注册,我们有ID和电子邮件
    • 用户在facebook上注册/登录并提供电子邮件
    • 我们会检查拥有此类电子邮件的用户是否已经存在,并为其设置facebook\u id
    • 现在用户可以通过facebook或电子邮件登录
    如果用户更改了他的facebook电子邮件-这不会破坏任何东西,如果我们在
    users
    表中已经有电子邮件,我们可以忽略此更改。因此,用户仍然可以使用他的旧电子邮件登录。(或者,使用其他登录历史记录,我们可以检查用户是否从未使用电子邮件登录,并用新的电子邮件替换)

    为facebook用户提供
    生成密码
    功能也很容易。他们可以在登录时输入电子邮件并生成密码,因此将来也可以使用电子邮件/密码登录

    您还可以添加
    忘记密码
    功能,该功能可以生成新密码并将其发送到用户的电子邮件中-这可供
    电子邮件
    用户和提供电子邮件的
    facebook
    用户使用

    如果我理解正确,您希望有一个统一的方法来创建新用户和验证现有用户,如下所示:

    • 用户输入,应用程序向后端发送电子邮件和密码
    • 检查是否存在具有此类电子邮件的用户
      • 用户存在-验证密码
      • 已通过-发送访问令牌
        • 失败-发送错误
      • 用户不存在-创建新用户和令牌
      • 发送访问令牌
    这与facebook类似,但我们不检查电子邮件/密码,而是检查facebook\u id并向facebook发出请求进行验证

    您还可以考虑使用独立的后端端点——一个登记新用户,另一个登录现有用户。 因为按照上面的过程,如果用户错误地键入了他的电子邮件,您将创建一个新用户,这是不期望的。 对于facebook来说,注册/登录可能没有多大区别

    我假设允许一个用户有多个auth令牌从不同的位置登录是有用的,因此下面是
    令牌
    表:

    • ID-整数,唯一ID,主键
    • 令牌字符串,唯一的访问令牌(您可以考虑将其作为主键)
    • user_id-整数,对拥有令牌的用户的引用
    • 创建时间-日期时间,创建日期
    • expired-布尔值,可用于实现令牌过期
    常规请求如下所示: