/** * Callback to log in users from Facebook. Be warned; it's messy. */ public function authenticateFromJavascript(Request $request, LaravelFacebookSdk\LaravelFacebookSdk $fb) { // Try to grab the Facebook API token that the SDK should give us try { $token = $fb->getJavaScriptHelper()->getAccessToken(); } catch (Facebook\Exceptions\FacebookSDKException $e) { // Failed to obtain access token; error out return Redirect::to('/login')->withErrors([$e->getMessage()]); } if (!$token) { // If the token is falsy... uhh, what the hell return Redirect::to('/login')->withErrors(["You haven't logged into Facebook correctly."]); } if (!$token->isLongLived()) { // OAuth 2.0 client handler. This is... a thing. $oauth_client = $fb->getOAuth2Client(); // Extend the access token. try { $token = $oauth_client->getLongLivedAccessToken($token); } catch (Facebook\Exceptions\FacebookSDKException $e) { return Redirect::to('/login')->withErrors([$e->getMessage()]); } } // Keep the User Access Token in Session storage, so we can use it for this request $data = $request->all(); Session::put('fb_user_access_token', (string) $token); if (isset($data["from"])) { Session::put('fb_logged_in_from', (string) $data["from"]); } // Use the user's access token by default for this request $fb->setDefaultAccessToken($token); try { // Request Facebook user data $response = $fb->get('/me?fields=id,name,email,location,bio,picture.width(800).height(800)'); } catch (Facebook\Exceptions\FacebookSDKException $e) { return Redirect::back()->withErrors([$e->getMessage()]); } // get a Graph User object $facebook_user = $response->getGraphUser(); try { $user = User::where('facebook_id', $facebook_user["id"])->firstOrFail(); } catch (ModelNotFoundException $e) { $facebook_user["username"] = $facebook_user["id"]; $user = User::createOrUpdateGraphNode($facebook_user); } // Use the Graph User to create a Laravel User with their data Auth::login($user); if (!$user->username) { $user->username = $user->facebook_id; $user->save(); return Redirect::to('/user/editProfile')->with('message', 'Almost set up! Please fill out your profile...'); } // Log the user into Laravel return Redirect::back(); }
/** * @return mixed */ public function postLogin() { /* * Login Facebook * Người dùng login bằng javascriptSDK sau đó sẽ gửi short token-key lên server. * Server sẽ dùng short token-key này để lấy long-lived token-key * Tiếp tục dùng long-lived token key để lấy thông tin của người dùng: id-facebook + email + name.... * Kiểm tra người dùng trên hệ thống. Lưu ý đây là người dùng facebook. Sẽ link sang user-sentinel bằng user_id. * Nếu người dùng chưa tồn tại trên hệ thống thì sẽ tạo 1 user mới để đăng nhập. User này do sentinel quản lý. Email/pass word do mình tự generate ra. * Nếu người dùng tồn tại trên hệ thống rồi => lấy user-sentinel => login-sentinel */ try { $token = $this->laravelFacebookSdk->getJavaScriptHelper()->getAccessToken(); if (!$token) { // User hasn't logged in using the JS SDK yet $this->setErrorData('not_authorized'); } else { // Get long-lived access token $longLiveAccessToken = $this->facebookHelper->extendToken($token); // Use long-lived access token above to get UserData $facebookUser = $this->facebookHelper->getSocialUserByLongLivedAccessToken($longLiveAccessToken); // Check current facebook user existed in user database $userSentinel = $this->facebookUser->isFacebookUserExisted($facebookUser); if (!$userSentinel) { $credentials = $facebookUser->toArray(); $credentials['password'] = md5(microtime()); /** @var \Modules\IzCustomer\Entities\User $userSentinel */ $userSentinel = $this->sentinel->registerAndActivate($credentials); // update relationship $userSentinel->facebook()->save($facebookUser); } // Login and remember to sentinel $this->sentinel->loginAndRemember($userSentinel); // set output $this->setResponseData($userSentinel->toArray()); } } catch (FacebookSDKException $e) { $this->setResponseCode(400); $this->setErrorData($e->getMessage()); } return $this->responseJson(); }
public function loginFacebookJs(\SammyK\LaravelFacebookSdk\LaravelFacebookSdk $fb) { try { $token = $fb->getJavaScriptHelper()->getAccessToken(); } catch (Facebook\Exceptions\FacebookSDKException $e) { // Failed to obtain access token dd($e->getMessage()); } // $token will be null if no cookie was set or no OAuth data // was found in the cookie's signed request data if (!$token) { // Get the redirect helper $helper = $fb->getRedirectLoginHelper(); if (!$helper->getError()) { abort(403, 'Unauthorized action.'); } // User denied the request dd($helper->getError(), $helper->getErrorCode(), $helper->getErrorReason(), $helper->getErrorDescription()); } if (!$token->isLongLived()) { // OAuth 2.0 client handler $oauth_client = $fb->getOAuth2Client(); // Extend the access token. try { $token = $oauth_client->getLongLivedAccessToken($token); } catch (Facebook\Exceptions\FacebookSDKException $e) { dd($e->getMessage()); } } $fb->setDefaultAccessToken($token); // Get basic info on the user from Facebook. try { $response = $fb->get('/me?fields=id,name,email,picture{url}'); } catch (Facebook\Exceptions\FacebookSDKException $e) { dd($e->getMessage()); } // Convert the response to a `Facebook/GraphNodes/GraphUser` collection $facebook_user = $response->getGraphUser(); // Create the user if it does not exist or update the existing entry. // This will only work if you've added the SyncableGraphNodeTrait to your User model. $user = User::createOrUpdateGraphNode($facebook_user); }