gpt4 book ai didi

ios - 为同时使用电子邮件和 facebook_id 的网络和移动设备创建用户创建/身份验证系统

转载 作者:IT王子 更新时间:2023-10-29 08:20:32 24 4
gpt4 key购买 nike

我正在使用 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',
    }
    }

    对于 Web,我们将 auth_token 作为 cookie 值传递。对于 iOS 应用程序,auth_token 将作为自定义 HTTP header 字段传递,例如“X-auth_token”
  • 在 Facebook 登录的情况下,他们将使用 FacebookSDK,从 FB 获得范围权限,然后发布

  • {
    user: {
    is_facebook_login: true,
    fb_email: 'joe@test.com',
    fb_auth_token: 'abigvaluefromFB'
    }
    }

    在服务器上,我们将确保他们通过以下方式传递有效的 fb_auth_token 凭据
    调用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_email 与 facebook 提供的电子邮件相对应。

    这是带有相应图表的步骤:

    脚步
  • oauth 请求到 facebook,仅请求电子邮件
  • 用户批准,电子邮件和身份验证 token 回来
  • 将 auth_token 发送到我们的服务器;如果是 facebook 授权的客户端,请设置标志以便只能通过 facebook 登录
  • 与 facebook 验证 token 是否准确

  • 现在不用担心,如果他们改变他们的 facebook 电子邮件,那么运气不好。如果他们通过 Facebook 登录,然后想通过电子邮件/密码登录,那么运气不好。

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

    enter image description here

    我们将回应
    {
    user:{
    id:23,
    auth_token:'md5value',
    }
    }

    iOS 应用程序将通过 https://github.com/kishikawakatsumi/KeychainAccess 将 auth_token 写入钥匙串(keychain)

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

    最佳答案

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

    缺失的部分是:

  • 您如何存储和识别用户?
  • 您如何存储身份验证 token ?
  • 一个用户可以拥有多个 token 吗?
  • 您想让旧 token 过期吗?

  • 您已经描述了两个过程 - 通过电子邮件注册新用户和通过 Facebook 注册新用户。

    在服务器上,我会像这样存储它们, users table :
  • ID - 整数,应用程序数据库中的唯一用户 ID
  • 电子邮件 - 字符串,可选(Facebook 可以不存在),表中唯一
  • facebook_id - 字符串,可选(使用电子邮件注册的用户将不存在),在表中唯一
  • 密码 - 字符串,可选(Facebook 用户没有密码)

  • 我还会在这样的场景中合并电子邮件/Facebook 用户:
  • 用户用邮箱注册,我们有ID和邮箱
  • 用户注册/登录facebook并提供电子邮件
  • 我们检查具有此类电子邮件的用户是否已存在并为其设置 facebook_id
  • 现在用户可以同时使用 facebook 或电子邮件登录

  • 如果用户更改了他的 facebook 电子邮件 - 这不会破坏任何内容,如果我们已经在 users 中拥有该电子邮件,我们可以忽略此更改。 table 。所以用户仍然可以使用他的旧电子邮件登录。 (或者,使用额外的登录历史,我们可以检查用户从未使用电子邮件登录并将其替换为新的)。

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

    您也可以添加 forgot password可以生成新密码并将其发送到用户电子邮件的功能 - email 可以同时使用此功能用户和那些 facebook谁提供了电子邮件。

    如果我的想法是正确的,您希望有一个统一的方法来创建新用户和验证现有用户,如下所示:
  • 用户输入和应用程序向后端发送电子邮件和密码
  • 检查具有此类电子邮件的用户是否存在
  • 用户存在 - 验证密码
  • 通过 - 发送访问 token
  • 失败 - 发送错误
  • 用户不存在 - 创建新用户和 token
  • 发送访问 token

  • 它与 facebook 类似,但我们检查 facebook_id 并根据对 facebook 的请求进行验证,而不是电子邮件/密码。

    您还可以考虑使用单独的后端端点 - 一个用于注册新用户,另一个用于登录现有用户。
    因为通过上述过程,如果用户输入错误的电子邮件,您将创建一个意想不到的新用户。
    对于 facebook 注册/登录可能不会有太大区别。

    我认为允许一个用户拥有多个身份验证 token 从不同位置登录是很有用的,所以这里是 tokens table :
  • ID - 整数、唯一 ID、主键
  • token - 字符串,唯一访问 token (您可以考虑将其设为主键)
  • user_id - 整数,引用拥有 token 的用户
  • created_at - 日期时间,创建日期
  • expired - bool 值,可用于实现 token 过期

  • 常规请求如下所示:
  • 有一个带有 X-auth_token 的请求
  • 在数据库中查找 token
  • 找到合适的用户
  • 允许用户访问他的资源

  • token 到期可以这样完成:
  • 有一个带有 X-auth_token 的请求
  • 在数据库中查找 token
  • 检查是否 now() - token.created_at > EXPIRATION_PERIOD
  • 将 token 标记为过期(token.expired = True + 保存)
  • 返回错误“ token 过期”
  • 在下一个请求 - 返回相同的错误,应用程序应该要求用户再次登录
  • 关于ios - 为同时使用电子邮件和 facebook_id 的网络和移动设备创建用户创建/身份验证系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34818677/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com