module Spree module Api module V2 module Platform class FirebaseController < ActionController::API require 'httparty' def firebase_verification(token) url = "https://www.googleapis.com/identitytoolkit/v3/relyingparty/getAccountInfo?key=AIzaSyCfY9JHxTinBizeZX7rt9E42dPRgj9NiNQ" firebase_verification_call = HTTParty.post(url, headers: { 'Content-Type' => 'application/json' }, body: { 'idToken' => token }.to_json ) if firebase_verification_call.response.code == "200" firebase_infos = firebase_verification_call.parsed_response else raise 'Error' end end def firebase_params params .require(:data) .permit(:token) end def firebase_login token = firebase_params.fetch(:token) firebase_infos = firebase_verification(token) email = findEmail(firebase_infos) password = findPassword(firebase_infos) user = Spree.user_class.find_for_database_authentication(email: email) if user.nil? user = ::Spree::User.new user.email = email user.password = password user.private_metadata = firebase_infos user.save end doorkeeper_response = HTTParty.post( 'https://ca97-204-157-173-118.ngrok-free.app/spree_oauth/token/', headers: { 'Content-Type' => 'application/json' }, body: { 'grant_type' => 'password', 'scope' => 'admin', 'username' => email, 'password' => password }.to_json ) render json: doorkeeper_response end def findEmail(userInfo) providerInfo = userInfo['users'][0]['providerUserInfo'][0]['providerId'] federatedID = userInfo['users'][0]['providerUserInfo'][0]['federatedId'] if providerInfo == 'password' email = userInfo['users'][0]['email'] elsif providerInfo == 'apple.com' email = federatedID + '@apple.com' elsif providerInfo == 'facebook.com' email = federatedID + '@facebook.com' else email = federatedID + '@gmail.com' end email end def findPassword(userInfo) providerInfo = userInfo['users'][0]['providerUserInfo'][0]['providerId'] if providerInfo == 'password' password = userInfo['users'][0]['passwordHash'] else password = userInfo['users'][0]['localId'] end password end end end end end end