Skip to content

Instantly share code, notes, and snippets.

@kakkoyun
Created April 12, 2015 19:40
Show Gist options
  • Save kakkoyun/2b38657bbdf4d8d6e5b8 to your computer and use it in GitHub Desktop.
Save kakkoyun/2b38657bbdf4d8d6e5b8 to your computer and use it in GitHub Desktop.
Passports Controller
class Api::V1::PassportsController < Api::V1::BaseController
before_action :validate
def create
if (passport = Passport.where(uid: params[:uid],
provider: params[:provider]).first)
respond_with(current_application.password.get_token(passport.user,
passport.user.password),
location: false)
# member = passport.user
# access_token = Doorkeeper::AccessToken.find_or_create_for(current_application, member.id, [], 7200, true)
# response_object = { access_token: access_token.token, token_type: 'bearer', expires_in: access_token.expires_in }
# respond_with(response_object, location: false)
elsif current_member
passport = current_member.passports.create!(provider: params[:provider], uid: params[:uid])
respond_with(passport, location: false)
else
member = Member.new
member.email = params[:email].present? ? params[:email] : "#{params[:uid]}@#{params[:provider]}.com"
member.username = params[:username].present? ? params[:username] : "MemberFrom#{params[:provider].titlecase}-#{params[:uid]}"
member.password = SecureRandom.urlsafe_base64
member.password_confirmation = member.password
member.save!
member.passports << Passport.new(provider: params[:provider], uid: params[:uid])
# puts access_token.token
respond_with current_application.password.get_token(passport.user, passport.user.password), location: false
# access_token = Doorkeeper::AccessToken.find_or_create_for(current_application, member.id, [], 7200, true)
# response_object = { access_token: access_token.token, token_type: 'bearer', expires_in: access_token.expires_in }
# respond_with(response_object, location: false)
end
end
def token
if Passport.where(uid: params[:uid], provider: params[:provider]).first
respond_with current_application.password.get_token(passport.user, passport.user.password), location: false
else
respond_with status: :unauthorized
end
end
private
def passport_params
params.permit(:email, :username, :provider, :uid)
end
def validate
@bad_token = Proc.new { respond_with({ error: "bad_token" }, location: false) }
@providers = {
facebook: FacebookTokenValidator,
twitter: TwitterTokenValidator,
google: GoogleTokenValidator
}
begin
@bad_token.call and return unless @providers.fetch(passport_params[:provider]).new(passport_params[:uid],
passport_params[:token]).call
rescue
@bad_token.call and return
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment