我想为社交网络创建一个登录名,例如Twitter,Facebook等。
但有像twitter这样的社交网络没有给我发电子邮件。
在保存用户以显示表单视图添加电子邮件的位置然后保存Twitter +电子邮件的所有数据之前,我该怎么办?
答案 0 :(得分:0)
我将假设您知道如何设置omniauth,因此我将直接跳到相关部分。
在回调中,如果找到指定的uid和提供者的用户,则签署并重定向。否则,您需要在会话中存储omniauth有效负载,并重定向到用户可以添加电子邮件的表单:
def twitter
if User.find_by(provider: auth.provider, uid: auth.uid)
# sign in user and redirect
else
session[:omniauth] ||= {}
session[:omniauth][auth.uid] = auth
redirect_to new_omniauth_email_request_path(ominauth_uid: auth.uid)
end
end
private
def auth
request.env['omniauth.auth']
end
将其添加到routes.rb时:
resources :omniauth, only: [], param: :uid do
resource :email_request, only: [:new, :create]
end
您将拥有以下两条新路线:
omniauth_email_request POST /omniauth/:omniauth_uid/email_request(.:format) email_requests#create
new_omniauth_email_request GET /omniauth/:omniauth_uid/email_request/new(.:format) email_requests#new
您需要创建EmailRequestsController
并实施new
和create
操作。在成功创建用户后,不要忘记清除会话:
def create
# ...
@user = User.create do |user|
user.email = params['email']
user.uid = params['omniauth_uid']
user.name = session[:omniauth][user.uid].name
# assign whatever else you may need from session[:omniauth][user.uid]
end
session[:omniauth].delete @user.uid if @user.persisted?
# ...
end
请注意,如果您计划支持多个omniauth提供程序,那么在"中间步骤"用户可以提供已经存在于数据库中的电子邮件(例如,用户已经通过传递电子邮件的一些其他omniauth进行了身份验证)。这种情况需要处理。