LightOpenID – pro Nette a PHP 7.4

ForestCZE
Člen | 209
+
0
-

Ahoj, hledám LightOpenID pro Nette a PHP 7.4. Jestli jsem to dobře pochopil, tak starší verze to měly v sobě. V té nové verzi, pokud dám:

$var = new \LightOpenID($host);

tak classa neexistuje. Na netu je dost těch knihoven, ale mají zastaralé funkce. Potřebuji na webu udělat logování přes Steam. Pokud někdo už vytvářel, budu vděčný. Díky.

Marek Bartoš
Nette Blogger | 1171
+
0
-

Dost o tom, že taková třída v Nette kdy byla pochybuju. Spíš jsi měl nainstalovanou nějakou knihovnu, která takto pojmenovanou třídu má, kupříkladu tuto https://github.com/…/LightOpenID

ForestCZE
Člen | 209
+
0
-

Mabar napsal(a):

Dost o tom, že taková třída v Nette kdy byla pochybuju. Spíš jsi měl nainstalovanou nějakou knihovnu, která takto pojmenovanou třídu má, kupříkladu tuto https://github.com/…/LightOpenID

Asi jsem se špatně vyjádřil. Myslel jsem, že byla přímo v PHP, ne v Nette.

Hned první věta: Lightweight PHP5 library for easy OpenID authentication. Tak nevím no…

Editoval ForestCZE (18. 3. 2020 19:32)

David Matějka
Moderator | 6445
+
0
-

o tom, ze byla primo v php dost pochybuju. a zkousel si nainstalovat ten odkazovany balicek?

ForestCZE
Člen | 209
+
0
-

David Matějka napsal(a):

o tom, ze byla primo v php dost pochybuju. a zkousel si nainstalovat ten odkazovany balicek?

Ano, zkoušel, ale vyhazuje mi to např.

get_magic_quotes_gpc() is deprecated

A dále, třeba toto. Nevidím, že by tam měl borec tu knihovnu a v tom kódu také vytváří instanci jako by to bylo součástí PHP.

David Matějka
Moderator | 6445
+
0
-

koukam, ze pro nektery distribuce existoval balicek, ktery tu tridu poskytoval (respektive nejakou starsi verzi nez ta, co je na githubu), ale soucasti php to nikdy nebylo

pokud to nefunguje, tak muzes zkusit projit forky, jestli neexistuje nejaky opraveny kod. nebo provest vlastni fork a zprovoznit to. urcite to oceni i dalsi lidi :)

ForestCZE
Člen | 209
+
0
-

Dal jsem to nějak dohromady.

Authentifikační metoda ve třídě Login:

public function auth()
    {
        $openID = new LightOpenID(self::HOST);
        if(!$openID->mode)
        {
            bdump("mode is null");
            $openID->identity = self::IDENTITY;
            header("Location: " . $openID->authUrl());
        }
        elseif($openID->mode == "cancel")
        {
            bdump("mode is cancel");
            $this->state = self::CANCEL;
            $this->session["state"] = self::CANCEL;
            return self::CANCEL;
        }
        else
        {
            bdump("validating...");
            if($openID->validate())
            {
                $ide = $openID->data["openid_identity"];
                $link = "http://steamcommunity.com/openid/id/";

                $steamID = str_replace($link, "", $ide);
                $this->state = self::SUCCESS;
                $this->session["state"] = self::SUCCESS;
                $this->user = $steamID;
                return $steamID;
            }
            else
            {
                $this->state = self::FAILED;
                $this->session["state"] = self::FAILED;
                return self::FAILED;
            }
        }
    }
public function isLogged()
    {
        if($this->state == null)
        {
            $this->state = $this->session["state"];
            $this->user = $this->session["user"];

            if($this->user)
                return true;
            else
                return false;
        }
        else
        {
            if($this->state == self::SUCCESS)
                return true;
            else
                return false;
        }
    }

Prsenter:

public function handleLogin()
    {
        $login = $this->login;

        if($login->isLogged())
        {
            $this->flashMessage('Již jste přihlášen.');
            $this->redirect('User:', $this->session->getSection('steam')->user);
        }
        else
        {
            $user = $login->auth();

            if($user)
            {
                $this->flashMessage('Úspěšně přihlášen.');
                $this->redirect('User:', $user);
            }
            elseif($user == $login::FAILED)
            {
                $this->flashMessage('Nejste přihlášen.');
                $this->redirect('this');
            }
            elseif($user == $login::CANCEL)
            {
                $this->flashMessage('Přihlášení zrušeno.');
                $this->redirect('this');
            }
        }
    }

Latte:

<a href="{link login!}"><img src="http://steamcommunity-a.akamaihd.net/public/images/signinthroughsteam/sits_02.png" alt="SteamLogin"></a>

Problém je ten, že mode je vždycky null
Dále mě pak překvapuje laděnka. Pokud kliknu na to tlačítko, přihlásím se přes steam, vrátí mě to na stránku a dostanu tohle:

Laděnka
Laděnka detailně

Nevím, jestli je dobře, že mě to redirectne dvakrát, ale asi ano, protože jednou mě to hodí na Steam Login a podruhé mě to musí vrátit. Když se podívám do té laděnky, tak mě zaráží, že tam jsou všechna ta data a pak už ne. Jako bych si to přepisoval někde. Dokazal by mi někdo prosím pomoct? Děkuji :)

Editoval ForestCZE (19. 3. 2020 20:28)

David Matějka
Moderator | 6445
+
+1
-

prijde mi divny, ze v kodu to saha na openid_mode, ale v tom requestu to mas oddeleny teckou – openid.mode

ale vic ti asi neporadim, budes muset debuggovat sam

ForestCZE
Člen | 209
+
0
-

David Matějka napsal(a):

prijde mi divny, ze v kodu to saha na openid_mode, ale v tom requestu to mas oddeleny teckou – openid.mode

ale vic ti asi neporadim, budes muset debuggovat sam

Tak nakonec jsem to celé překopal. Zjistil jsem, že ten mode ani validace není potřeba. Po přihlášení to prostě všechna ta data hodí do $_GET. Vytáhnu si ID parsováním odkazu a toť vše.

Důležitá věc. V laděnce to píše ty tečky, ale ve skutečnosti tam je lomítko, takže pak už to byla hračka.

@DavidMatějka Moc děkuji za nakopnutí, bez tebe bych to celé nepředělal a nevydal se tím správným směrem. Vážím si věcných odpovědí, které člověka někam posunou :)