Fórum pro vývojáře
    • Kategorie
    • Nepřečtené
    • Nejnovější
    • Populární
    • World
    • Přihlásit se

    Bug: POST /token nepřijímá http basic auth

    Scheduled Připnuto Uzamknuto Přesunuto OAuth přihlášení přes Seznam
    12 Příspěvky 5 Přispěvatelé 51 Zobrazení
    Načítání více příspěvků
    • Od nejstarších po nejnovější
    • Od nejnovějších po nejstarší
    • S nejvíce hlasy
    Odpovědět
    • Odpovědět jako Téma
    Přihlásit se pro odpověď
    Toto téma bylo odstraněno. Jen uživatelé s oprávněním správy témat ho mohou vidět.
    • Ondřej ŽáraO Offline
      Ondřej Žára
      naposledy upravil

      Dobrý den,

      mohu se optat, co přesně se stane, pokud data pošlete v application/x-www-form-urlencoded? Na první pohled mi přijde, že by to mělo fungovat -- a pokud nefunguje, pokusím se zařídit, aby fungovalo. Potřebuji k tomu však vědět, kdy přesně se pokoušíte, jak vypadá tělo/hlavičky požadavků a z jaké IP adresy tak činíte.

      David ObdržálekD Dominika FečoD 2 odpovědí Poslední odpověď Odpovědět Citovat 0
      • David ObdržálekD Offline
        David Obdržálek @Ondřej Žára
        naposledy upravil

        Dobrý den,
        omlouvám se, moje chyba, problém nebyl v content-type, ale v těle požadavku.

        Stejně ale dost práce to s pomocí next-auth (5.0.0-beta.18) / oauth4webapi (2.10.4) rozchodit.

        1. pokus neposílal client_id a client_secret v těle požadavku, ale http auth v hlavičce

        POST https://login.szn.cz/api/v1/oauth/token
        Accept: application/json
        Authorization: Basic ZTQzMzY0ZmYz....
        Content-Type: application/x-www-form-urlencoded;charset=UTF-8
        User-Agent: oauth4webapi/v2.10.4

        redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fcallback%2Fseznam&code_verifier=uHUSlWlHaWHsJ_AC6xMwjuIFADi4vq3tUuuhHV3gDIM&code=2%7CjIznFzf8xPUbN1BSVwBHUFVRRQ5BWhNSNzATEGA9Zn0Sib9K5XZeKl8o3A_zaX0lSqDVkJinXp7AYZ26yjOUC3Q&grant_type=authorization_code

        Odpověď: 400 BAD REQUEST
        error { error: 'invalid_grant', message: 'client_id mismatch' }

        1. pokus, přesvědčil jsem oauth4webapi, že bude posílat client_id a client_secret v těle požadavku (token_endpoint_auth_method: 'client_secret_post')

        POST https://login.szn.cz/api/v1/oauth/token
        Accept: application/json
        Content-Type: application/x-www-form-urlencoded;charset=UTF-8
        User-Agent: oauth4webapi/v2.10.4

        redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fcallback%2Fseznam&code_verifier=2i1gAkMk_tEE3954bEupAfxuKP4Lvm4zksV_M1A-_78&code=2%7CjIznFzfKyvUbN1BSVwBHUFVRRQ5BWhNSNyICA1UcZn0SbPQlwuhuGhwnKA2s-StuZMifJ8-2RLi9uxqlWEoUAV8&grant_type=authorization_code&client_id=e43364ff312f884661189efd84d3716b83206d7cac0f7ddb&client_secret=...

        Odpověď: 400 BAD REQUEST
        error { error: 'invalid_grant' }

        1. pokus, přesvědčil jsem next-auth, že nebude používat PKCE, ale obyčejný state verifier

        POST https://login.szn.cz/api/v1/oauth/token
        Accept: application/json
        Content-Type: application/x-www-form-urlencoded;charset=UTF-8
        User-Agent: oauth4webapi/v2.10.4

        redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fcallback%2Fseznam&code_verifier=auth&code=2%7CjIznFzfCy_UbN1BSVwBHUFVRRQ5BWhNSNx8OKVkoZn0S-D0VlrkcYPqpKSgfsVTrwGT_n9qds5YWQCKHRkt6ig8&grant_type=authorization_code&client_id=e43364ff312f884661189efd84d3716b83206d7cac0f7ddb&client_secret=...

        Odpověď: 200 OK 🎉

        Takto už mi to funguje bez zásahů do knihoven 🙂
        Stejně by nebylo špatné, kdyby Vaše strana uměla přijímat client_id a client_secret jako http basic auth. I ten PKCE verifier (https://datatracker.ietf.org/doc/html/rfc7636) by se hodil.

        Děkuji a zdravím,
        David O

        Dominika FečoD CelinorplusC 2 odpovědí Poslední odpověď Odpovědět Citovat 0
        • Ondřej ŽáraO Offline
          Ondřej Žára
          naposledy upravil

          Hezky den,

          jsem rad, ze vam to uz funguje.

          Co se tyce podpory Authorization hlavicky, tam to moc dobre nevidim - je to vlastne uz treti mechanismus prijmu techto dat (vedle JSONu a x-www-form-urlencoded) a nejsem si jisty, jak velky uzitek to prinasi.

          PKCE ve skutecnosti podporujeme, ale narazil jste na chybu nasi implementace. Zjistil jsem, ze code_challenge ukladame v okamziku, kdy se uzivatel prihlasi (zada jmeno a heslo). Pokud k nam na overeni posilate jiz prihlaseneho uzivatele, tak nedojde k ulozeni code_challenge a tim padem ani k naslednemu overeni code_verifier. Asi to muzete experimentalne overit tim, ze zapnete PKCE a pokusite se o prihlaseni v anonymnim okne prohlizece.

          Zkusim to vyhledove nejak napravit a vyresit.

          S pozdravem
          Ondrej Zara

          1 odpověď Poslední odpověď Odpovědět Citovat 0
          • Ondřej ŽáraO Offline
            Ondřej Žára
            naposledy upravil

            ...vydali jsme opravu PKCE. S trochou štěstí už by vám tato varianta nyní také měla fungovat. Pokud ne, pošlete prosím zase ukázku nějakých failujících požadavků.

            David ObdržálekD 1 odpověď Poslední odpověď Odpovědět Citovat 0
            • David ObdržálekD Offline
              David Obdržálek @Ondřej Žára
              naposledy upravil

              Dobrý den,
              děkuji, že se tomu věnujete 🙂

              PKCE mi bohužel nefunguje ani u přihlášeného uživatele, ani u nepřihlášeného uživatele v anonymním okně.
              Code Challange Method je S256 (SHA256). Knihovna, kterou používám, code challenge v plaintextu neumí.

              GET https://login.szn.cz/api/v1/oauth/auth?scope=identity%2Ccontact-phone%2Cavatar&response_type=code&client_id=e43364ff312f884661189efd84d3716b83206d7cac0f7ddb&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fcallback%2Fseznam&code_challenge=22heX1LKL-OJyVhBwXaojWm_FOVdyiTThkjqPxZpegY&code_challenge_method=S256

              ...

              POST https://login.szn.cz/api/v1/oauth/token
              Accept: application/json
              Content-Type: application/x-www-form-urlencoded;charset=UTF-8
              User-Agent: oauth4webapi/v2.10.4

              redirect_uri=http%3A%2F%2Flocalhost%3A3000%2Fapi%2Fauth%2Fcallback%2Fseznam&code_verifier=VyVtetPZUei4rN_nXbyzMP26Cx-X2-QolXgqTXHDJ0o&code=2%7CjIznFzeftf4bN1BSVwBHUFVRRQ5BWhNSNwwYGXUOZn0SQ2QljliMtivjMCeQt0dpw-7C5_LANglnA8TgpgGWsGo&grant_type=authorization_code&client_id=e43364ff312f884661189efd84d3716b83206d7cac0f7ddb&client_secret=...

              Odpověď: 400 BAD REQUEST
              error { error: 'invalid_grant' }

              HTTP Basic Auth asi není moc důležitý, hodil by se k tomu, že ho některé knihovny ho používají jako default. Třeba oauth4webapi, kterou používá knihovna next-auth. Tato metoda (client_secret_basic) je uvedená v dokumentaci OAuth (https://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml#token-endpoint-auth-method).

              Je to v zásadě jednoduché, posílá se se base64(client_id + ":" + client_secret)

              Kdyby byl client_id 123 a client secret 456, poslalo by se base64("123:456"), tedy
              Authorization: Basic MTIzOjQ1Ng==

              Děkuji,
              David O

              Ondřej ŽáraO 1 odpověď Poslední odpověď Odpovědět Citovat 0
              • Ondřej ŽáraO Offline
                Ondřej Žára @David Obdržálek
                naposledy upravil

                Dobry den,

                omlouvam se za pozdni odpoved, nemel jsem ted bohuzel cas se PKCE venovat. Nyni jiz mam - ale za tak dlouho zpetne nemam potrebne logy. Pokud byste chtel, muzete se pokusit o autorizaci vcetne code_challenge (a nasledne code_verifier) a dat mi vedet, jaky den a v kolik hodin jste to zkousel. Projdu logy a podivam se.

                Hned na prvni pohled:

                base64.urlsafe_b64encode(sha256("VyVtetPZUei4rN_nXbyzMP26Cx-X2-QolXgqTXHDJ0o".encode()).digest())
                b'22heX1LKL-OJyVhBwXaojWm_FOVdyiTThkjqPxZpegY='

                ...a ve vasem pozadavku s code_challenge nevidim ten padding (rovnitko) na konci. Ale definitivneji to budu moct rozhodnout jen pohledem do logu.

                Filip SkokanF 1 odpověď Poslední odpověď Odpovědět Citovat 0
                • Filip SkokanF Offline
                  Filip Skokan @Ondřej Žára
                  naposledy upravil

                  ...a ve vasem pozadavku s code_challenge nevidim ten padding (rovnitko) na konci

                  zadne tam byt nema, RFC 7636 jasne definuje S256 code_challenge_method pouzivajic "Base64url Encoding" jako "with all trailing '=' characters omitted"

                  1 odpověď Poslední odpověď Odpovědět Citovat 0
                  • Dominika FečoD Offline
                    Dominika Fečo @Ondřej Žára
                    naposledy upravil

                    Ahoj máš Jak 🥰

                    1 odpověď Poslední odpověď Odpovědět Citovat 0
                    • Dominika FečoD Offline
                      Dominika Fečo @David Obdržálek
                      naposledy upravil

                      Ahoj máš Jak 🥰 David

                      1 odpověď Poslední odpověď Odpovědět Citovat 0
                      • CelinorplusC Offline
                        Celinorplus @David Obdržálek
                        naposledy upravil

                        Dobrý den, mohu se zeptat jak přesně se vám podařilo nastavit Auth.js (NextAuth). Mám pravděpodobně stejný problém, ale nepodařilo se mi podle Vašeho třetího pokusu nastavit providera v Auth.ts . Děkuji

                        David ObdržálekD 1 odpověď Poslední odpověď Odpovědět Citovat 0
                        • David ObdržálekD Offline
                          David Obdržálek @Celinorplus
                          naposledy upravil

                          Dobrý ten, tady je provider file, který používám:

                          https://github.com/deltazero-cz/next-auth/blob/main/packages/core/src/providers/seznam.ts

                          V configu pro Auth potom:

                          ...
                          providers: [

                          Seznam({
                            clientId: process.env.SEZNAM_CLIENT_ID,
                            clientSecret: process.env.SEZNAM_CLIENT_SECRET,
                            scope: 'identity,contact-phone,avatar',
                            profile: (profile) => { ... },
                          }),
                          

                          ...
                          ]
                          ...

                          A šlape to dobře 🙂

                          1 odpověď Poslední odpověď Odpovědět Citovat 0
                          • First post
                            Last post