Rails:在保留 postgres 记录和关联的同时迁移到 Auth0
Rails: Migrating to Auth0 while retaining postgres records and associations
我的项目目前使用has_secure_password
来处理用户(类似于railscast)。一切正常,但展望未来,我觉得切换到 Auth0 会带来好处,并希望在太多用户注册之前立即进行转换。
用户被保存到具有多个关联的用户模型(checkins/comments/etc。)我如何才能将 Auth0 用户 link 保存到我数据库中的用户记录。我想我可以在他们登录后通过电子邮件查找(因为它们是唯一的)或 Auth0 用户 ID(并向用户 table 添加一个新列)。似乎我可以简单地使用 Auth0 登录回调来让用户登录(使用我当前的会话控制器),但是当他们在 OmniAuth 中创建时,我如何在我的数据库上创建用户。是否也有回调?
在一个完美的世界里,我想做这样的事情:
- 用户使用 Auth0 锁注册。在 Auth0 数据库上创建一个新帐户。
- 回调触发在我的数据库中创建一条新记录,其中包含来自 Auth0 的所有信息并具有关联列。
- 用户登录,他们的 user_id(来自我的数据库)存储在会话中。
- 用户对个人信息所做的更改(name/email/etc。)在两个数据库上都发生了更改。
我想要的有可能吗?还是我应该坚持使用当前的身份验证?
实施 Auth0 授权与任何其他 OAuth 提供者(例如 Facebook、Twitter、Github 等)之间没有重大区别。Auth0 quickstart guide 有点奇怪,因为它没有显示您如何将 link 凭据提供给应用程序中的用户模型。相反,他们只是将整个 shebang 推到会话中。
您需要对此处的用户模型进行的唯一真正更改是添加一个 uid
列,用于存储用户的 Auth0 uid
。
OmniAuth 的 OAuth 流程基本上是这样工作的:
- 用户单击 link,将用户重定向到提供商 OAuth 门户。 (或者在 Auth0 的情况下,它是一个花哨的 JS 小部件)
- 提供商重定向回您的应用程序,它会转到回调控制器上的
callback
或 failure
方法。
- 此时用户可能是新用户或回访用户。因此,您尝试根据 auth hash 中的
uid
在您的应用程序中找到用户,或者从 auth 哈希创建一个新用户。
- 您登录并重定向用户。
class Auth0Controller < ActionController::Base
# the signed up or logged in on auth0
# GET "/auth/auth0/callback"
def callback
auth_hash = request.env['omniauth.auth']
@user = User.find_or_intialize_by(uid: auth_hash[:uid])
if @user.new_record?
@user.name = auth_hash.name
@user.email = auth_hash.email # etc
@user.save!
end
reset_session
session[:user_id] = @user.id
redirect_to root_path, success: "Hello #{@user.name}"
end
# the user declined to give your app permissions
# GET "/auth/failure"
def failure
redirect_to root_path, alert: "Oh noes"
end
end
参见:
我的项目目前使用has_secure_password
来处理用户(类似于railscast)。一切正常,但展望未来,我觉得切换到 Auth0 会带来好处,并希望在太多用户注册之前立即进行转换。
用户被保存到具有多个关联的用户模型(checkins/comments/etc。)我如何才能将 Auth0 用户 link 保存到我数据库中的用户记录。我想我可以在他们登录后通过电子邮件查找(因为它们是唯一的)或 Auth0 用户 ID(并向用户 table 添加一个新列)。似乎我可以简单地使用 Auth0 登录回调来让用户登录(使用我当前的会话控制器),但是当他们在 OmniAuth 中创建时,我如何在我的数据库上创建用户。是否也有回调?
在一个完美的世界里,我想做这样的事情:
- 用户使用 Auth0 锁注册。在 Auth0 数据库上创建一个新帐户。
- 回调触发在我的数据库中创建一条新记录,其中包含来自 Auth0 的所有信息并具有关联列。
- 用户登录,他们的 user_id(来自我的数据库)存储在会话中。
- 用户对个人信息所做的更改(name/email/etc。)在两个数据库上都发生了更改。
我想要的有可能吗?还是我应该坚持使用当前的身份验证?
实施 Auth0 授权与任何其他 OAuth 提供者(例如 Facebook、Twitter、Github 等)之间没有重大区别。Auth0 quickstart guide 有点奇怪,因为它没有显示您如何将 link 凭据提供给应用程序中的用户模型。相反,他们只是将整个 shebang 推到会话中。
您需要对此处的用户模型进行的唯一真正更改是添加一个 uid
列,用于存储用户的 Auth0 uid
。
OmniAuth 的 OAuth 流程基本上是这样工作的:
- 用户单击 link,将用户重定向到提供商 OAuth 门户。 (或者在 Auth0 的情况下,它是一个花哨的 JS 小部件)
- 提供商重定向回您的应用程序,它会转到回调控制器上的
callback
或failure
方法。 - 此时用户可能是新用户或回访用户。因此,您尝试根据 auth hash 中的
uid
在您的应用程序中找到用户,或者从 auth 哈希创建一个新用户。 - 您登录并重定向用户。
class Auth0Controller < ActionController::Base
# the signed up or logged in on auth0
# GET "/auth/auth0/callback"
def callback
auth_hash = request.env['omniauth.auth']
@user = User.find_or_intialize_by(uid: auth_hash[:uid])
if @user.new_record?
@user.name = auth_hash.name
@user.email = auth_hash.email # etc
@user.save!
end
reset_session
session[:user_id] = @user.id
redirect_to root_path, success: "Hello #{@user.name}"
end
# the user declined to give your app permissions
# GET "/auth/failure"
def failure
redirect_to root_path, alert: "Oh noes"
end
end
参见: