/** * Authenticate a user based on Facebook access token. If the email address from facebook is already in the database, * the facebook user id will be added. * If not, a new user will be created with a random password and user info from facebook. */ public function authenticateFacebook() { $input = Input::all(); $validator = Validator::make($input, User::getAuthFBRules()); if ($validator->passes()) { $facebook = new FacebookWrapper(); $facebook->loginAsUser($input['access_token']); $profile = $facebook->getMe(); if (is_array($profile) && isset($profile['error'])) { return json_encode($profile); } Log::info(json_encode($profile->asArray())); $user = User::where('facebook_id', '=', $profile->getId())->first(); if (!$user instanceof User) { $user = User::where('email', '=', $profile->getProperty('email'))->first(); } if (!$user instanceof User) { // Create an account if none is found $user = new User(); $user->firstname = $profile->getFirstName(); $user->lastname = $profile->getLastName(); $user->email = $profile->getProperty('email'); $user->password = Hash::make(uniqid()); } $user->facebook_id = $profile->getId(); $user->save(); $device_id = Input::has('device_id') ? $input['device_id'] : ''; $device_type = Input::has('device_type') ? $input['device_type'] : ''; $device_token = Input::has('device_token') ? $input['device_token'] : ''; $token = $user->login($device_id, $device_type, $device_token); Log::info('<!> Device Token Received : ' . $device_token . ' - Device ID Received : ' . $device_id . ' for user id: ' . $token->user_id); Log::info('<!> FACEBOOK Logged : ' . $token->user_id . ' on ' . $token->device_os . '[' . $token->device_id . '] with token ' . $token->token); $token = $token->toArray(); $token['user'] = $user->toArray(); Log::info(json_encode($token)); return ApiResponse::json($token); } else { return ApiResponse::validation($validator); } }