· 7 years ago · Jul 11, 2018, 02:36 PM
1class AuthController < ApplicationController
2
3 def twitter
4 process_callback
5 end
6
7 def facebook
8 process_callback
9 end
10
11 private
12
13 def process_callback
14 oauth_data = request.env['omniauth.auth']
15
16 user = sign_in_with_oauth_data(oauth_data) unless user_signed_in?
17 user.register_social_profile(normalize_oauth_data(oauth_data), normalize_profile_data(oauth_data))
18
19 redirect_to '/'
20 end
21
22
23 protected
24
25 def sign_in_with_oauth_data(data)
26 user = User.find_or_create_with_oauth(data)
27 sign_in :user, user
28
29 user
30 end
31
32 def normalize_oauth_data(oauth_data)
33 {service_name: oauth_data.provider, uid: oauth_data.uid, access_token: oauth_data.credentials.token, secret_key: oauth_data.credentials.secret}
34 end
35
36 def normalize_profile_data(oauth_data)
37 result = { service_name: oauth_data.provider }
38 result.merge!(send(:"normalize_#{oauth_data.provider}_data", oauth_data))
39
40 result
41 end
42
43 def normalize_facebook_data(oauth_data)
44 data = oauth_data.extra.raw_info
45 { full_name: data.name, picture: data.picture, link: data.link }
46 end
47
48 def normalize_twitter_data(oauth_data)
49 data = oauth_data.extra.raw_info
50 { username: data.screen_name, picture: data.profile_image_url, full_name: data.name, lang: data.lang }
51 end
52
53 def normalize_instagram_data(oauth_data)
54 data = oauth_data.info
55 { full_name: data.name, picture: data.image, username: data.nickname }
56 end
57end