´Cosmic 2.1 ~ Facebook Connect & Forgot Password

Results 1 to 3 of 3
  1. #1
    Member XxMurphyxX is offline
    MemberRank
    Jun 2012 Join Date
    71Posts

    thumbs up ´Cosmic 2.1 ~ Facebook Connect & Forgot Password

    Cosmic Github

    | Let's Get Started
    Install facebook/graph-sdk with composer, with cmd locate your CMS and run the following command:

    Code:
    composer require facebook/graph-sdk
    | Step 1 - Add Facebook App Configuration

    Let's go to App/Config.php

    And right below 'const site' we add up this facebook array:

    PHP Code:
        /**
         * Website settings
         * recaptcha v2: Create a inisible reCAPTCHA V2       [MENTION=848466]GoOgl[/MENTION]e website
         * Set null if you dont want a reCAPTCHA.
         */

        
    const site = array(
          
    'domain'      => 'Kubbo.me',
          
    'cpath'       => 'https://swfs.kubbo.us',
          
    'fpath'       => 'https://habbo.com.br/habbo-imaging',
          
    'shortname'   => 'Kubbo',
          
    'sitename'    => 'Kubbo'
        
    );

        const 
    facebook = array(
          
    'id'          => 'YOUR APP ID',
          
    'secret_key'  => 'YOUR SECRET KEY'
        
    );
          
        const 
    language 'ES'
    | Step 2 - Adding Facebook Id to our Users Table
    On your database, edit table users and add column fb_id

    Just like so:
    Spoiler:




    | Step 3 - Adding up Facebook Button to Login

    On App/Controllers/Home/Index.php file let's add our new Facebook Array to our rendered template:

    PHP Code:
            View::renderTemplate('Home/home.html', [
                
    'title'     => !request()->player Locale::get('core/title/home') : request()->player->username,
                
    'page'      => 'home',
                
    'rooms'     => $rooms,
                
    'groups'    => $groups,
                
    'news'      => $news,
                
    'oftw'      => $oftw,
                
    'currencys' => isset($currencys) ? $currencys null,
                
    'random'    => isset($random) ? $random null,
                
    'facebook'  => Config::facebook
            
    ], 10); 
    With this, we have access to write {{facebook.X}} on our HTMLs files.

    Then we go to App/View/base.html file and we add the next script

    Code:
    <div id="fb-root"></div>
    <script type="text/javascript">
            	function DeleteCookie(name)
            	{
            		document.cookie = name + '=; Max-Age=0';
            	}
            	
            	function SetCookie(cname, cvalue, exdays)
            	{
            		var d = new Date();
            		d.setTime(d.getTime() + (exdays*24*60*60*1000));
            		var expires = "expires="+d.toUTCString();
            		document.cookie = cname + "=" + cvalue + "; " + expires;
            	}
            
                window.fbAsyncInit = function() {
            		DeleteCookie("fbhb_val_{{facebook.id}}");
                    FB.init({
                        appId: "{{facebook.id}}",
                        version    : 'v2.4',
                        channelUrl : '/fbchannel',
                        status: true,
                        cookie: true,
                        xfbml: true
                    });
            
            
                    $(document).fire("fbevents:scriptLoaded");
                };
                window.assistedLogin = function(FBobject, optresponse) {
            		DeleteCookie("fbhb_val_{{facebook.id}}");
                    FBobject.init({
                        appId: '{{facebook.id}}',
                        version    : 'v2.4',
                        channelUrl : '/fbchannel',
                        status: true,
                        cookie: true,
                        xfbml: true
                    });
            
                    permissions = 'email';
                    defaultAction = function(response) {
                        if (response.authResponse) {
                            fbConnectUrl = "/facebook?connect=true";
                            DeleteCookie("fbhb_val_{{facebook.id}}");
                            SetCookie("fbhb_val_{{facebook.id}}", response.authResponse.accessToken, 1);
                            DeleteCookie("fbhb_expr_{{facebook.id}}");
                            SetCookie("fbhb_expr_{{facebook.id}}", response.authResponse.expiresIn, 1);
                            window.location.replace(fbConnectUrl);
                        }
                    };
            
                    if (typeof optresponse == 'undefined')
                        FBobject.login(defaultAction, {scope:permissions});
                    else
                        FBobject.login(optresponse, {scope:permissions});
            
                };
            
                (function() {
                    var e = document.createElement('script');
                    e.async = true;
                    e.src = document.location.protocol + '//connect.facebook.net/es_ES/sdk.js#version=v2.4';
                    document.getElementById('fb-root').appendChild(e);
                }());
            
            </script>
    And right below our Login button, add your facebook connect button:
    PHP Code:
    <button type="submit" class="rounded-button blue plain" id="login-request">Log in</button>
    <
    button class="rounded-button blue plain" onclick="assistedLogin(FB); return false; "  id="fb-login-request">Login with Facebook!</button
    | Step 3 - Facebook Route
    Cosmic already has this route coded, although it doesn't work

    You may see this on Core/Routes.php

    PHP Code:
    Router::get('/facebook''Home\Login@facebook'); 
    This is calling facebook() function on Login Controller.

    | Step 3 - Facebook Function

    Create facebook() function on App/Controllers/Home/Login.php file below googleAuthentication function

    This part can be modified with medium level PHP knowledge, this function what it does is:

    Logs In or Registers the user depending if the user exists or doesn't.

    PHP Code:
    public function facebook()
        {
            
    $settings Core::settings();

            
    $fb = new Facebook([
                
    'app_id' => Config::facebook['id'],
                
    'app_secret' => Config::facebook['secret_key'],
                
    'default_graph_version' => 'v2.10'
            
    ]);
            
            
    $response $fb->get('/me?fields=id,name,email,gender,birthday'$_COOKIE['fbhb_val_' Config::facebook['id']]);

            
    $user_profile $response->getGraphObject()->asArray();

            
    $player Player::getDataByFacebookID($user_profile['id'], array('id''username''password''rank''secret_key''pincode'));

            if(
    $player == null)
            {
                
    $getMaxIp Player::checkMaxIp(request()->getIp());

                if (
    $getMaxIp != && $getMaxIp >= $settings->registration_max_ip) {
                    
    response()->json(["status" => "error""message" => Locale::get('register/too_many_accounts')]);
                }


               
    $email = isset($user_profile['email']) ? $user_profile['email'] : $user_profile['id'] . '@facebook.com';

                if (isset(
    $user_profile['gender']) && $user_profile['gender'] === 'male')
                {
                    
    $gender 'M';
                    
    $look 'ch-210-1211.sh-300-63.lg-285-64.ha-1002-63.hr-828-1061.hd-180-1';
                }
                else
                {
                    
    $gender 'F';
                    
    $look 'hd-600-1.ch-813-1211.ha-1005-63.lg-720-64.hr-890-1061.sh-735-63';
                }

                
    $playerData = (object)[
                    
    'username' => Player::GenerateName($email),
                    
    'fb_id' => $user_profile['id'],
                    
    'password' => '',
                    
    'email' => '',
                    
    'account_created' => time(),
                    
    'credits' => Core::settings()->start_credits,
                    
    'figure' => $look,
                    
    'birthdate_day' => 17,
                    
    'birthdate_month' => 06,
                    
    'birthdate_year' => 2020,
                    
    'gender' => $gender,
                    
    'last_login' => time(),
                    
    'ip_register' => request()->getIp(),
                    
    'ip_current' => request()->getIp()
                ];

                if (!
    Player::create($playerData)) {
                    
    response()->json(["status" => "error""message" => Locale::get('core/notification/something_wrong'), "captcha_error" => "error"]);
                }

                
    $player Player::getDataByFacebookID($user_profile['id'], array('id''username''password''rank''secret_key''pincode'));

                
    $freeCurrencys Core::getCurrencys();
          
                if(
    $freeCurrencys) {
                    foreach(
    $freeCurrencys as $currency) {
                        
    Player::createCurrency($player->id$currency->type);
                        
    Player::updateCurrency($player->id$currency->type$currency->amount);
                    }
                }
            }

            
    Auth::login($player);
            
    redirect('/home');
        } 
    Do not forget to import facebook/graph-sdk and use it on the controller:

    PHP Code:
    ...
    use 
    Library\Json;
    use 
    Library\HotelApi;

    use 
    Facebook\Facebook;

    use 
    Sonata\GoogleAuthenticator\GoogleAuthenticator;
    ... 

    Also I forgot, on the same imports:

    You can delete:
    PHP Code:
    use App\Core
    And add:
    PHP Code:
    use App\Models\Core
    Because Facebook Function uses:
    PHP Code:
    $settings Core::settings(); 
    Reading the code, we can see that we are using some functions of Player Model that do not exist yet such as:
    Player::getDataByFacebookID() or Player::GenerateName()

    | Step 4 - Players Model Modification

    Now we are going to edit App/Models/Player.php file

    Add a function to search user by using the fb_id on Step 2.

    PHP Code:
        public static function getDataByFacebookID($fb_id$data null)
        {
            return 
    QueryBuilder::table('users')->select($data ?? static::$data)->setFetchMode(PDO::FETCH_CLASSget_called_class())->where('fb_id'$fb_id)->first();
        } 
    Add a function to Generate a Random Name based on Facebook Email Address
    PHP Code:
        public static function GenerateName($e$t 0)
        {
            
    $e $E substr(strstr($e'@') ? explode('@'$e)[0] : $e018);
            
    $c = ['.''-''_'];

            if (
    strlen($e) > 6)
                foreach (
    $c as $C)
                {
                    if (
    strstr($e$C) === FALSE) continue;
                    
    $n rand(01);
                    
    $e explode($C$e);
                    
    $e strlen($e[$n]) < ? ($e[($n === 1) ? 1]) : $e[$n];
                    break;
                }
            
            
    $r self::exists($e);

            if (
    $r === null)    return null;
            if (
    $r === false)    return $e;
            
            
    $c strlen($e);
            
    $r = ($c 10) ? rand(rand(1$t), rand(2$t)) : ($c 8) ? rand(rand(2$t), rand(3$t)) : rand(rand(3$t), rand(3$t));

            
    $e .= self::Random($rtruefalse'-_=?!@:.,');
            
    $r self::exists($e);
            
            if (
    $r === null)    return null;
            if (
    $r === false)    return $e;

            
    self::GenerateName($E$t++);
        } 
    PHP Code:
        public static function Random($l$n true$L true$o '')
        {
            
    $c '';
            
    $c .= $n '0123456789' '';
            
    $c .= $L 'QWERTYUIOPASDFGHJKLLZXCVBNMqwertyuiopasdfghjklzxcvbnm' '';
            
    $c .= $o;

            
    $s '';
            
    $C 0;
            while (
    $C $l)
            { 
                
    $s .= substr($crand(0strlen($c) -1), 1);
                
    $C++;
            }

            return 
    $s;
        } 
    Modify function create($data) to add fb_id in case of Facebook Registration

    PHP Code:
    public static function create($data)
        {
            
    $data = array(
                
    'username' => $data->username,
                
    'password' => Hash::password($data->password),
                
    'mail' => $data->email,
                
    'fb_id' => $data->fb_id,
                
    'account_created' => time(),
                .... 
    | Step 5 - Registration File Modification

    Since now we are requiring an extra field on the create function, let's just add it on the $playerData in App/Controllers/Home/Registration.php file

    PHP Code:
    $playerData = (object)input()->all();
    $playerData->figure input()->post('figure')->value;
    $playerData->fb_id '';
    $getMaxIp Player::checkMaxIp(request()->getIp()); 
    | Notes

    This approach doesn't give user an email to connect via Cosmic Login Process nor a password. Doesn't check if facebook email is already registered on Cosmic users simply doesn't give Facebook Account an email. I would suggest to modify facebook function to add code to enable "can_change_name" on Arcturus users_settings. And I guess that's it. Any issues or suggestions just comment on the section below. Thank you!


    | Forgot Password Tips

    Set up your App/Config.php file, only change your support email and the password

    PHP Code:
        const mailHost      'smtp.gmail.com';
        const 
    mailFrom      'SUPPORT-EMAIL@gmail.com';
        const 
    mailUser      'SUPPORT-EMAIL@gmail.com';
        const 
    mailPass      'YOUR-GMAIL-PASSWORD';
        const 
    mailPort      465
    Then log into your GMAIL and allow less secure apps
    https://www.google.com/settings/u/1/...lesssecureapps
    https://accounts.google.com/b/0/DisplayUnlockCaptcha
    Last edited by XxMurphyxX; 19-06-20 at 04:13 AM.


  2. #2
    Novice Maricores is offline
    MemberRank
    Aug 2021 Join Date
    1Posts

    Re: ´Cosmic 2.1 ~ Facebook Connect & Forgot Password

    Is it still working? I am in a very frustrating situation now. I have forgotten my Facebook password. It was always saved on my google account information, so I never had to write it. Now that I deleted some of my data from my google account, I accidentally deleted my passwords, and now I can't log in to many of my accounts. It is a big problem because I use a lot of social media platforms for promoting my business, and losing the passwords from them is a big problem, so I need to recover the passwords as soon as possible.
    Last edited by Maricores; 22-02-22 at 01:31 PM.

  3. #3
    Novice JonosOld is offline
    MemberRank
    Aug 2021 Join Date
    1Posts

    Re: ´Cosmic 2.1 ~ Facebook Connect & Forgot Password

    Is it still working?



Advertisement