Skip to content

Commit f91c7bd

Browse files
author
minhyeok92
committed
패스워드 입력해야 기존 이메일과 병합 가능하도록
1 parent c2b3f62 commit f91c7bd

File tree

5 files changed

+54
-36
lines changed

5 files changed

+54
-36
lines changed

app/controllers/users/omniauth_callbacks_controller.rb

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,22 +2,22 @@ class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
22
def facebook
33
@user = User.find_for_oauth2(request.env["omniauth.auth"])
44

5-
if @user.persisted? and @user.uid != nil
6-
sign_in_and_redirect @user, :event => :authentication
7-
elsif @user.persisted? and @user.uid == nil
5+
if @user.nil?
86
session["devise.facebook_data"] = request.env["omniauth.auth"]
9-
redirect_to users_merge_path(@user.id, 'facebook_data')
7+
redirect_to users_merge_path('facebook')
8+
else
9+
sign_in_and_redirect @user, :event => :authentication
1010
end
1111
end
1212

1313
def google_oauth2
1414
@user = User.find_for_oauth2(request.env["omniauth.auth"])
1515

16-
if @user.persisted? and @user.uid != nil
16+
if @user.nil?
17+
session["devise.facebook_data"] = request.env["omniauth.auth"]
18+
redirect_to users_merge_path('facebook')
19+
else
1720
sign_in_and_redirect @user, :event => :authentication
18-
elsif @user.persisted? and @user.uid == nil
19-
session["devise.google_data"] = request.env["omniauth.auth"]
20-
redirect_to users_merge_path(@user.id, 'google_data')
2121
end
2222
end
2323

app/controllers/users_controller.rb

Lines changed: 28 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5,32 +5,43 @@ def show
55
end
66

77
def merge
8-
@user = User.find(params[:id])
98
@provider = params[:provider]
9+
@user = User.where(email: session["devise." + @provider + "_data"]["info"]["email"]).first
1010

11-
if params[:callback] == 'callback'
12-
provider_session = session["devise." + @provider]
11+
end
1312

14-
@user.merge(params[:id], provider_session["provider"], provider_session["uid"])
13+
def merge_callback
14+
@provider = params[:provider]
15+
provider_session = session["devise." + @provider + "_data"]
16+
@user = User.where(email: provider_session["info"]["email"]).first
17+
18+
if @user.valid_password?(params[:password])
19+
@user.merge(@user.id, provider_session["provider"], provider_session["uid"])
20+
sign_in_and_redirect @user, :event => :authentication
21+
else
1522
redirect_to root_path
16-
end
17-
23+
end
1824
end
1925

2026
def sign_up_from_twitter
2127
end
2228

2329
def sign_up_from_twitter_callback
24-
auth = session["devise.twitter_data"]
25-
26-
@user = User.new(provider:auth["provider"],
27-
uid:auth["uid"],
28-
nickname: auth["extra"]["raw_info"]["screen_name"],
29-
password: Devise.friendly_token[0,20])
30-
31-
@user.email = params[:user]["email"]
32-
33-
@user.save!
34-
sign_in_and_redirect @user, :event => :authentication
30+
if User.where(email: params[:user]["email"]).first
31+
@user = User.new
32+
render sign_up_from_twitter_path
33+
else
34+
auth = session["devise.twitter_data"]
35+
36+
@user = User.new(provider:auth["provider"],
37+
uid:auth["uid"],
38+
nickname: auth["extra"]["raw_info"]["screen_name"],
39+
password: Devise.friendly_token[0,20])
40+
41+
@user.email = params[:user]["email"]
42+
43+
@user.save!
44+
sign_in_and_redirect @user, :event => :authentication
45+
end
3546
end
3647
end

app/models/user.rb

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,15 +47,18 @@ def self.new_with_session(params, session)
4747

4848
def self.find_for_oauth2(access_token)
4949
data = access_token.info
50-
51-
user = User.where(:email => data["email"]).first
50+
user = User.where(provider: access_token.provider, uid: access_token.uid).first
5251

5352
unless user
54-
user = User.create!(provider:access_token.provider,
55-
uid:access_token.uid,
56-
email: data["email"],
57-
password: Devise.friendly_token[0,20],
58-
nickname: data["name"])
53+
if User.where(email: data["email"]).first
54+
nil
55+
else
56+
user = User.create!(provider:access_token.provider,
57+
uid:access_token.uid,
58+
email: data["email"],
59+
password: Devise.friendly_token[0,20],
60+
nickname: data["name"])
61+
end
5962
end
6063
user
6164
end

app/views/users/merge.html.erb

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11

22
<h1>중복되는 이메일이 있어요 => <%= @user.email %></h1>
33

4-
<p>이 아이디와 통합할까요?</p>
4+
<p>이 아이디와 통합하려면 기존 계정의 패스워드를 입력하세요</p>
55

6-
<%= link_to 'Yeah', users_merge_path(@user.id, :provider => @provider, :callback => 'callback'), class: "btn btn-primary" %>
7-
<%= link_to 'NoNo', root_path, class: "btn btn-default" %>
6+
<%= form_tag({controller: "users", action: "merge_callback"}, method: "get") do %>
7+
<%= password_field_tag(:password) %>
8+
<%= submit_tag("Submit", class: "btn btn-primary") %>
9+
10+
<% end %>

config/routes.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@
22
get 'users/sign_up_from_twitter', to: 'users#sign_up_from_twitter', as: 'sign_up_from_twitter'
33
post 'users/sign_up_from_twitter_callback', to: 'users#sign_up_from_twitter_callback', as: 'sign_up_from_twitter_callback'
44

5-
get '/users/merge/:id/:provider(/:callback)', to: 'users#merge', as: 'users_merge'
5+
get '/users/merge/:provider', to: 'users#merge', as: 'users_merge'
6+
get '/users/merge/:provider/callback', to: 'users#merge_callback', as: 'users_merge_callback'
67

78
devise_for :users, :controllers => {
89
:omniauth_callbacks => "users/omniauth_callbacks",

0 commit comments

Comments
 (0)