omniauth_callbacks_controller.rb
3.45 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController
def github
github_login = env["omniauth.auth"].extra.raw_info.login
github_token = env["omniauth.auth"].credentials.token
github_user = User.where(github_login: github_login).first
github_site_title = Errbit::Config.github_site_title
if github_user.nil? && (github_org_id = Errbit::Config.github_org_id)
# See if they are a member of the organization that we have access for
# If they are, automatically create an account
client = Octokit::Client.new(access_token: github_token)
client.api_endpoint = Errbit::Config.github_api_url
org_ids = client.organizations.map(&:id)
if org_ids.include?(github_org_id)
github_user = User.create(name: env["omniauth.auth"].extra.raw_info.name, email: env["omniauth.auth"].extra.raw_info.email)
end
end
# If user is already signed in, link github details to their account
if current_user
# ... unless a user is already registered with same github login
if github_user && github_user != current_user
flash[:error] = "User already registered with #{github_site_title} login '#{github_login}'!"
else
# Add github details to current user
update_user_with_github_attributes(current_user, github_login, github_token)
flash[:success] = "Successfully linked #{github_site_title} account!"
end
# User must have clicked 'link account' from their user page, so redirect there.
redirect_to user_path(current_user)
elsif github_user
# Store OAuth token
update_user_with_github_attributes(github_user, github_login, github_token)
flash[:success] = I18n.t "devise.omniauth_callbacks.success", kind: github_site_title
sign_in_and_redirect github_user, event: :authentication
else
flash[:error] = "There are no authorized users with #{github_site_title} login '#{github_login}'. Please ask an administrator to register your user account."
redirect_to new_user_session_path
end
end
def google_oauth2
google_uid = env['omniauth.auth'].uid
google_email = env['omniauth.auth'].info.email
google_user = User.where(google_uid: google_uid).first
google_site_title = Errbit::Config.google_site_title
# If user is already signed in, link google details to their account
if current_user
# ... unless a user is already registered with same google login
if google_user && google_user != current_user
flash[:error] = "User already registered with #{google_site_title} login '#{google_email}'!"
else
# Add github details to current user
current_user.update(google_uid: google_uid)
flash[:success] = "Successfully linked #{google_email} account!"
end
# User must have clicked 'link account' from their user page, so redirect there.
redirect_to user_path(current_user)
elsif google_user
flash[:success] = I18n.t 'devise.omniauth_callbacks.success', kind: google_site_title
sign_in_and_redirect google_user, event: :authentication
else
flash[:error] = "There are no authorized users with #{google_site_title} login '#{google_email}'. Please ask an administrator to register your user account."
redirect_to new_user_session_path
end
end
private def update_user_with_github_attributes(user, login, token)
user.update_attributes(
github_login: login,
github_oauth_token: token
)
end
end