Skocz do zawartości

Zdjęcie
* * * * * 3 głosy

CodeIgniter - Logowanie za pomocą Facebook API


2 odpowiedzi w tym temacie
  • Zaloguj się, aby dodać odpowiedź
webproject
3
Neutralna
  • LocationLublin / Sanok

Napisano 10 listopada 2013 - 13:50

#1
W dobie Social Media bardzo powszechnym stało się używanie jednego konta dla wielu aplikacji www. Podyktowane jest to oczywiście potrzebami użytkowników, przeciętny Kowalski nie chce zakładać miliona kont i później pamiętać milion haseł. Przecietny Kowalski woli założyć jedno konto i później logować się za jego pomocą na milion serwisów. Wygodne? Bardzo. Jednym kliknięciem, bez zbędnęgo i żmudnego procesu rejestracji, klikania w linki aktywacyjne itd. Tylko jak to się robi? Nawet się nie spodziewasz że wszystko sprowadza się do kilku linijek kodu.
 
Co nam będzie potrzebne? W pierwszej kolejności proponuje zaznajomić się z cudeńkiem ze stajni Marka Z.
 
 
Pod tym adresem znajdziesz również Facebook PHP SDK. Pobierz sobie tą paczkę, będziemy z niej korzystać.
Paczka zawiera kilka folderów jednakże nas interesuje tylko folder src. Ok kopiujemy jego zawartość i wklejamy do folderu application/libraries. Kolejną czynnością jaką musimy wykonać jest sprawienie aby Codeigniter rozpoznał plik Facebook.php jako bibliotekę i pozwolił ją załaczyć do projektu. Rzućmy okiem w dokumentację Codeigniter-a
 
 
Jak widzisz, pierwsze co musimy sprawdzić czy zachodzi zgodność z konwencjami nazewnictwa. Nazwa biblioteki musi zaczynać się z dużej litery i posiadać w sobie klasę o takiej samej nazwie jak nazwa pliku. Poprawmy więc nazwę pliku z facebook.php na Facebook.php. Ok i to powinno wystarczyć.
Aby dołączyć naszą bibliotekę możemy użyć autoloadera lub też dołączyć ją ręcznie w kontrolerze. Preferuje ten drugi sposób ponieważ zakładam że będę z niej korzystał tylko w przypadku logowania, więc nie widzę sensu aby była ona ładowana przy każdym requescie.
Ok, stwórzymy sobie teraz kontroler odpowiedzialny za autoryzację usera.
class Fblogin extends CI_Controller {
 
    public function __construct(){
        parent::__construct();
    }
 
}
Jak widzisz, nie ma tu za wiele kodu, ale za chwilę to uzupełnimy, dodajmy sobie naszą bibliotekę.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Fblogin extends CI_Controller {

    public function __construct(){
        parent::__construct();

        $this->load->library('facebook');
    }

}
Ok, jeżeli zachciało Ci sie przeanalizować kod klasy Facebook to pewnie zauważyłeś że tamtejszy konstruktor przyjmuje parametr $config. Dodatkowo na stronie http://developers.fa.../reference/php/ jest pokazana przykładowa implementacja:
require_once("facebook.php");

$config = array();
$config['appId'] = 'YOUR_APP_ID';
$config['secret'] = 'YOUR_APP_SECRET';

$facebook = new Facebook($config);
Ok czyli $config jest tablicą zawierającą dwa parametry, Numer ID naszej aplikacji utowrzonej na facebooku za pomocą ktorej będziemy się łączyć z facebookiem oraz sekretny klucz. Jeżeli masz już taką aplikację to możesz przejść do następnego kroku, jeżeli nie to teraz jest odpowiedni moment na klepnięcie sobie takiej apki. Odpalaj facebooka i klikaj w Utwórz aplikację (znajdziesz to w menu rozwijanym z prawej górnej strony). Ok znajdujemy się teraz w strefie dla developerów, klikamy w pozycję Apps (górne menu) i następnie w Create New App. Podajemy nazwę naszej aplikacji, w tym miejscu Twoja kreatywność zostanie poddana próbie :) . Klikamy Kontynuuj i zostajemy przeniesieni do panelu zarządzania naszą aplikacją.
Jest tu kilka istotnych elementów do ustawienia jednakże interesuje nas najbardziej sekcja górna zawierająca numer ID aplikacji oraz klucz sekretny. Minimalizujemy przeglądarkę i wracamy do naszego projektu.
Nie wiem jak ty ale ja jestem zwolennikiem porządku w kodzie i wole trzymać wszelkie ustawienia w tablicy $config w osobnym pliku konfiguracyjnym i odwoływać się do poszczególnych indexów w kodzie.
Ok, swtórzmy sobie taki plik konfiguracyjny,
<?php

$config['fb_appId'] = 'nasz App ID';
$config['fb_secret'] = 'nasz App Secret';
Oczywiście w miejsca “nasz App ID” i “nasz App Secret” wklejamy wartości skopiowane z panelu edycyjnego naszej aplikacji. Ok, zapisujemy plik w foderze application/config jako np main_config.php.
Wracamy do naszego kontrolera, musimy sobie teraz dołączyć ten pliczek.
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Fblogin extends CI_Controller {

    public function __construct(){
        parent::__construct();
        parse_str($_SERVER['QUERY_STRING'], $_REQUEST);
        $this->config->load('main_config');

        $this->load->library('facebook');
    }

Kolejnym krokiem jest utworzenie tablicy zawierającej appID i secret i wysłanie jej do konstruktora klasy Facebook, czyli do naszej biblioteki.

$this->config->load('main_config');
$config_array = array('appId' => $this->config->item('fb_appId'), 'secret' => $this->config->item('fb_secret'));
$this->load->library('facebook', $config_array);
Ok, wróćmy jeszcze na chwilkę do panelu edycji aplikcaji, aby nasz szystem logowania działał poprawnie musimy ustawić tu jeszcze dwie wartości, App domains, site URL oraz zablokujmy “tryb piaskownicy”. Pamiętaj że wartość w App domains czyli nazwa naszej domeny powinna zawierać tylko i wyłącznie adres właściwy naszej domeny bez http. https, www itd. W moim przypadku będzie to po prostu webproject.sanok.pl. Site URL z kolei zawiera już pełny adres www: http://www.webproject.sanok.pl
Ok wracamy do naszego kontrolera. Utwórzmy sobie za tem publiczną składową która będzie przechowywać dane usera który aktualnie sie zalogował i ustawmy jej wartość początkową NULL
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class Fblogin extends CI_Controller {

    public $user = NULL;

    public function __construct(){
        parent::__construct();

        parse_str($_SERVER['QUERY_STRING'], $_REQUEST);
        $this->config->load('main_config');
        $config_array = array('appId' => $this->config->item('fb_appId'), 'secret' => $this->config->item('fb_secret'));
        $this->load->library('facebook', $config_array);
    }

}

Ok, przypiszmy teraz dane użytkownika do tej zmiennej

$this->user = $this->facebook->getUser();

Utwórzmy teraz metode index która będzie sprawdzać stan użytkownika.

public function index()
    {
        if($this->user){
            try{
                $user_profile = $this->facebook->api('/me');
                print_r($user_profile);
            }
            catch(facebookApiException $e){
                $this->user = null;
                print_r($e);
            }
        }
    }
Jak widzisz, nie jest to jakaś zbyt rozbudowana metoda, sprawdza stan usera i wyświetla odpowiednie informacje, albo tablicę zawierające dane usera albo wywala wyjątek.
Dopiszmy sobie teraz kolejną instrukcję warunkową która będzie pozwalała na Logowanie i wylogowywanie się usera.
if($this->user){
            $logout = $this->facebook->getLogoutUrl(array('next'=>base_url('fblogin/logout')));
            echo "<a href = '$logout'>Wyloguj</a>";
        }
        else{
            $login = $this->facebook->getLoginUrl();
            echo "<a href = '$login'>Zaloguj</a>";
        }

Jak widzisz aby umożliwić userowi poprawne wylogowanie się z naszego portalu musimy dopisać kolejną metodę logout w kontrolerze fblogin.

public function logout(){
        session_destroy();
        redirect(base_url());
    }
Ok, nasz system autoryzacji opartej na facebook Api gotowy, nie jest to zbyt trudne. Przykład tutaj podany jest bardzo prosty, możesz oczywiście go zmodyfikowac wg własnej woli. Masz do tego całe API
 
Artykuł ten jest mojego autorstwa i pochodzi ze strony http://webproject.sanok.pl
Pozdrawiam serdecznie

 


  • 2

unbreak

    WT Elite

  • 1 937 postów
    • Czas spędzony online: 27d 8h 43m 36s
506
Znakomita!
  • Location/home/unbreak

Napisano 11 listopada 2013 - 18:24

#2

Nie czytałem całego, bo nie potrzebuję, ale plusik jest bo artykuł wygląda na na prawdę dobry :)


  • 0

webDeveloper


webproject
3
Neutralna
  • LocationLublin / Sanok

Napisano 11 listopada 2013 - 20:01

#3

Dzięki, takie komentarze są zawsze motywujące :)


  • 0





Podone tematy Collapse

Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych