Advertisement
Guest User

Untitled

a guest
May 11th, 2016
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.53 KB | None | 0 0
  1. module FacebookLoginHelper
  2.  
  3. def login_with_facebook
  4. return unless fetch_fb_profile
  5.  
  6. setup_user_by_fb
  7. create_token_info
  8. set_token_on_user
  9.  
  10. if User.devise_modules.include?(:confirmable)
  11. @user.skip_confirmation!
  12. end
  13.  
  14. sign_in(:user, @user, store: false, bypass: false)
  15.  
  16. @user.save!
  17.  
  18. # Code for storing data from params needed for sending push notifications can be injected here:
  19. yield @user
  20.  
  21. set_auth_header
  22. status = @oauth_registration ? :created : :ok
  23. respond({json: @user.as_json, status: status})
  24. end
  25.  
  26.  
  27. def fetch_fb_profile
  28. graph = Koala::Facebook::API.new(fb_access_token)
  29. begin
  30. @fb_profile = graph.get_object('me', fields: ['name', 'email'])
  31. rescue Koala::Facebook::AuthenticationError
  32. login_failure('Invalid or expired access token.')
  33. return false
  34. rescue Faraday::ConnectionFailed
  35. login_failure('Connection problem.')
  36. return false
  37. rescue
  38. login_failure('Some problem occurred.')
  39. return false
  40. end
  41.  
  42. unless @fb_profile
  43. login_failure('No such FB profile.')
  44. return false
  45. end
  46.  
  47. true
  48. end
  49.  
  50.  
  51. private
  52. def login_failure(msg)
  53. respond({json: {errors: [msg]}, status: 401})
  54. end
  55.  
  56.  
  57. def set_auth_header
  58. auth_header = @user.build_auth_header(@token, @client_id)
  59. response.headers.merge!(auth_header)
  60. end
  61.  
  62.  
  63. def fb_access_token
  64. params[:access_token]
  65. end
  66.  
  67.  
  68. def setup_user_by_fb
  69. @user = User.where(
  70. {
  71. uid: @fb_profile['id'],
  72. provider: 'facebook'
  73. }).first_or_initialize
  74.  
  75. if @user.new_record?
  76. @oauth_registration = true
  77. set_random_password
  78. set_generated_nickname
  79. end
  80.  
  81. set_email_from_fb
  82.  
  83. @user
  84. end
  85.  
  86.  
  87. def set_email_from_fb
  88. email = @fb_profile['email']
  89. @user.email = email if email
  90. end
  91.  
  92.  
  93. def set_generated_nickname
  94. fb_name = @fb_profile['name'].gsub(' ', '')
  95. if User.where(nickname: fb_name).empty?
  96. @user.nickname = fb_name
  97. else
  98. @user.nickname = fb_name + SecureRandom.hex(5)
  99. end
  100. end
  101.  
  102.  
  103. def set_random_password
  104. password = SecureRandom.urlsafe_base64(nil, false)
  105. @user.password = password
  106. @user.password_confirmation = password
  107. end
  108.  
  109.  
  110. def create_token_info
  111. @client_id = SecureRandom.urlsafe_base64(nil, false)
  112. @token = SecureRandom.urlsafe_base64(nil, false)
  113. @expiry = (Time.now + DeviseTokenAuth.token_lifespan).to_i
  114. end
  115.  
  116.  
  117. def set_token_on_user
  118. @user.tokens[@client_id] = {
  119. token: BCrypt::Password.create(@token),
  120. expiry: @expiry
  121. }
  122. end
  123.  
  124. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement