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.
    • 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