<?xml version="1.0" encoding="UTF-8" ?>

<bugzilla version="5.2"
          urlbase="https://bugzilla.altlinux.org/"
          
          maintainer="jenya@basealt.ru"
>

    <bug>
          <bug_id>56132</bug_id>
          
          <creation_ts>2025-09-24 17:28:18 +0300</creation_ts>
          <short_desc>Ошибка invalid_client ответом на запрос авторизации OAuth c использованием client_secret</short_desc>
          <delta_ts>2025-12-09 02:07:16 +0300</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>4</classification_id>
          <classification>Development</classification>
          <product>Sisyphus</product>
          <component>python3-module-django-oauth-toolkit</component>
          <version>unstable</version>
          <rep_platform>x86_64</rep_platform>
          <op_sys>Linux</op_sys>
          <bug_status>CLOSED</bug_status>
          <resolution>FIXED</resolution>
          
          
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords></keywords>
          <priority>P5</priority>
          <bug_severity>normal</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Макаров Игорь Иванович">makarovii</reporter>
          <assigned_to name="thatman@altlinux.org">thatman</assigned_to>
          <cc>burmatov202002</cc>
    
    <cc>igor</cc>
    
    <cc>thatman</cc>
    
    <cc>toni</cc>
          
          <qa_contact>qa-sisyphus</qa_contact>

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>273094</commentid>
    <comment_count>0</comment_count>
    <who name="Макаров Игорь Иванович">makarovii</who>
    <bug_when>2025-09-24 17:28:18 +0300</bug_when>
    <thetext>Платформы (Обновлены до Sisyphus): 
Alt Workstation K 11.1 x86_64
Alt Education 11.0 KDE x86_64
Alt Education 11 x86_64
Alt Server 11 x86_64

Версия пакета: python3-module-django-oauth-toolkit 2.3.0-alt1

Не могли бы, пожалуйста, уточнить по вопросу:
 В ходе настройки приложение OAuth внести изменения получилось, только через веб интерфейс и запрос к серверу c client_secret происходит с ошибкой invalid_client как можно сделать основную проверку, корректности работы client secret и как применить настройки приложения без входа на страничку администратора?

Шаги по которым выполнял настройку:

1. Установить пакеты необходимые для запуска OAuth приложения.
# apt-get install python3 python3-module-django python3-module-django-dbbackend-sqlite3 python3-module-django-oauth-toolkit

2. Создать приложение myapp
$ python3 manage.py startapp myapp

3. Создать хранимку для пользователей
$ python3 manage.py startapp users

4. Проверка для моделей пользователей
$ cat &gt; users/models.py &lt;&lt; EOF
from django.db import models
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    pass
EOF

5. Добавить поддержку пользователй в настройки
$ sed -i &quot;s|&apos;django.contrib.staticfiles&apos;,|&apos;django.contrib.staticfiles&apos;,\n\t&apos;users&apos;,|g&quot; myproject/settings.py

6. Добавить настройки моделей
$ sed -i &quot;s|DEBUG = True|DEBUG = True\nAUTH_USER_MODEL = &apos;users.User&apos;|g&quot; myproject/settings.py

7. Добавляем в настройки компонент oauth2_provider
$ sed -i &quot;s|&apos;django.contrib.staticfiles&apos;,|&apos;django.contrib.staticfiles&apos;,\n\t&apos;oauth2_provider&apos;,|g&quot; myproject/settings.py

8.$ cat &gt;&gt; myproject/settings.py &lt;&lt; EOF
OAUTH2_PROVIDER = {
    &apos;HASH_CLIENT_SECRET&apos;: False,
    &apos;ACCESS_TOKEN_EXPIRE_SECONDS&apos;: 36000,
    &apos;REFRESH_TOKEN_EXPIRE_SECONDS&apos;: 864000,
    &apos;SCOPES&apos;: {
        &apos;read&apos;: &apos;Read scope&apos;,
        &apos;write&apos;: &apos;Write scope&apos;,
    }
}
EOF

9. Настройки URLs и смигрировать
$ cat &gt; myproject/urls.py &lt;&lt; EOF
from django.contrib import admin
from django.urls import include, path
from oauth2_provider import urls as oauth2_urls

urlpatterns = [
    path(&apos;admin/&apos;, admin.site.urls),
    path(&apos;o/&apos;, include(oauth2_urls)),
]
EOF

10. Страничка авторизации admin
$ sed -i &quot;s|DEBUG = True|DEBUG = True\nLOGIN_URL = &apos;/admin/login/&apos;|g&quot; myproject/settings.py

11. Создать супер пользователя admin, admin@admin.ru, admin и выполнить миграцию
$ python3 manage.py makemigrations &amp;&amp; python3 manage.py migrate &amp;&amp; python3 manage.py createsuperuser

12. Запустить сервер
$ cd myproject/ &amp;&amp; python3 -W all manage.py runserver --verbosity 3

13. Создать приложение в новой вкладке под пользователем
$ cd myproject/
$ python3 manage.py shell -c &quot;
from oauth2_provider.models import Application
from django.contrib.auth import get_user_model
usermodel = get_user_model()
admin = usermodel.objects.get(username=&apos;admin&apos;)
app = Application.objects.create(
     name=&apos;My App&apos;,
     user=admin,
     client_type=&apos;confidential&apos;,
     authorization_grant_type=&apos;authorization-code&apos;,
     redirect_uris=&apos;http://127.0.0.1:8000/noexist/callback&apos;,
    )
print(app.client_id) #сохранить вывод
print(app.client_secret) #сохранить вывод
app.save()
&quot; -v 2

14. Создать code_challenge
import random
import string
import base64
import hashlib

code_verifier = &apos;&apos;.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(random.randint(43, 128)))

code_challenge = hashlib.sha256(code_verifier.encode(&apos;utf-8&apos;)).digest()
code_challenge = base64.urlsafe_b64encode(code_challenge).decode(&apos;utf-8&apos;).replace(&apos;=&apos;, &apos;&apos;)

15. Открыть приложение в веб интерфейсе, проверить значения для чек-бокса hash client secret.
Фактический результат:
Чекбокс хешировать секретный код - установлен
Ожидаемый результат:
Чекбокс будет разселекчен, секрет код не хешируется в бд

16. Авторизовать клиента с помощью code_challenge и client_id. Происходит ошибка client_invalid. 
Ожидаемый результат:
Для клиентского Grants access_token устанавливается expiration date с значением из setting.py 
Фактический результат:
Для авторизации клиента увеличиваем в ручную expiration date и проводим авторизацию клиента.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273195</commentid>
    <comment_count>1</comment_count>
    <who name="Alexander Burmatov">burmatov202002</who>
    <bug_when>2025-09-25 22:15:48 +0300</bug_when>
    <thetext>Для начала необходимо убедиться, что HASH_CLIENT_SECRET=False действительно применяется при создании приложения.
Сделать это можно, дописав в shell перед импортом Application, следующее:
&gt; from django.conf import settings
&gt; print(settings.OAUTH2_PROVIDER.get(&apos;HASH_CLIENT_SECRET&apos;))</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273198</commentid>
    <comment_count>2</comment_count>
    <who name="igmk">igor</who>
    <bug_when>2025-09-25 22:43:13 +0300</bug_when>
    <thetext>(In reply to Alexander Burmatov from comment #1)
&gt; Для начала необходимо убедиться, что HASH_CLIENT_SECRET=False действительно
&gt; применяется при создании приложения.
&gt; Сделать это можно, дописав в shell перед импортом Application, следующее:
&gt; &gt; from django.conf import settings
&gt; &gt; print(settings.OAUTH2_PROVIDER.get(&apos;HASH_CLIENT_SECRET&apos;))

Эта проверка после создания приложения.
Проводил такую проверку, но слегка отличным способом.
Значение не применялось.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273200</commentid>
    <comment_count>3</comment_count>
    <who name="Alexander Burmatov">burmatov202002</who>
    <bug_when>2025-09-25 23:23:58 +0300</bug_when>
    <thetext>Тогда прежде всего необходимо применить настройки.
В shell, в первую очередь:
&gt; import django
&gt; django.setup()

Также проблема может быть в отсутствии DJANGO_SETTINGS_MODULE.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273254</commentid>
    <comment_count>4</comment_count>
    <who name="Макаров Игорь Иванович">makarovii</who>
    <bug_when>2025-09-26 11:56:23 +0300</bug_when>
    <thetext>(Ответ для Alexander Burmatov на комментарий #3)
&gt; Тогда прежде всего необходимо применить настройки.
&gt; В shell, в первую очередь:
&gt; &gt; import django
&gt; &gt; django.setup()
&gt; 
&gt; Также проблема может быть в отсутствии DJANGO_SETTINGS_MODULE.

Я раскрою этот вопрос с .setup(), хотя в документации написано использовать app_name.save() 

И, из документации можно применить настройки отдельно для приложения, а можно глобально. И так, и так не получилось применить настройки для приложения, только через веб админку.

Другой вопрос, с нехешированным client_secret (до записи его в БД) реквест с ним для авторизации клиента (получить access_token) происходит с ошибкой client_invalid. Если не трудно можно мне чуть пояснить, про этот мало для меня знакомый MVT</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273285</commentid>
    <comment_count>5</comment_count>
    <who name="Alexander Burmatov">burmatov202002</who>
    <bug_when>2025-09-26 16:22:30 +0300</bug_when>
    <thetext>&gt; Я раскрою этот вопрос с .setup(), хотя в документации написано использовать
&gt; app_name.save() 
Это разные вещи.

&gt; И, из документации можно применить настройки отдельно для приложения, а
&gt; можно глобально. И так, и так не получилось применить настройки для
&gt; приложения, только через веб админку.
Из вот этой: https://django-oauth-toolkit.readthedocs.io/en/2.3.0/getting_started.html ?

&gt; Другой вопрос, с нехешированным client_secret (до записи его в БД) реквест с
&gt; ним для авторизации клиента (получить access_token) происходит с ошибкой
&gt; client_invalid. Если не трудно можно мне чуть пояснить, про этот мало для
&gt; меня знакомый MVT
Скорее всего, проблема в том же (не применены настройки).</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273286</commentid>
    <comment_count>6</comment_count>
    <who name="Макаров Игорь Иванович">makarovii</who>
    <bug_when>2025-09-26 16:39:30 +0300</bug_when>
    <thetext>(Ответ для Alexander Burmatov на комментарий #5)
&gt; &gt; Я раскрою этот вопрос с .setup(), хотя в документации написано использовать
&gt; &gt; app_name.save() 
&gt; Это разные вещи.
&gt; 
&gt; &gt; И, из документации можно применить настройки отдельно для приложения, а
&gt; &gt; можно глобально. И так, и так не получилось применить настройки для
&gt; &gt; приложения, только через веб админку.
&gt; Из вот этой:
&gt; https://django-oauth-toolkit.readthedocs.io/en/2.3.0/getting_started.html ?
&gt; 
&gt; &gt; Другой вопрос, с нехешированным client_secret (до записи его в БД) реквест с
&gt; &gt; ним для авторизации клиента (получить access_token) происходит с ошибкой
&gt; &gt; client_invalid. Если не трудно можно мне чуть пояснить, про этот мало для
&gt; &gt; меня знакомый MVT
&gt; Скорее всего, проблема в том же (не применены настройки).

&gt; Скорее всего, проблема в том же (не применены настройки).
Я выполнил проверку с применением настроек через веб интерфейс и получаю ошибку invalid_client 
Не получаю эту ошибку, если стираю данные client_secret руками</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273287</commentid>
    <comment_count>7</comment_count>
    <who name="Макаров Игорь Иванович">makarovii</who>
    <bug_when>2025-09-26 16:40:47 +0300</bug_when>
    <thetext>(Ответ для Alexander Burmatov на комментарий #5)
&gt; &gt; Я раскрою этот вопрос с .setup(), хотя в документации написано использовать
&gt; &gt; app_name.save() 
&gt; Это разные вещи.
&gt; 
&gt; &gt; И, из документации можно применить настройки отдельно для приложения, а
&gt; &gt; можно глобально. И так, и так не получилось применить настройки для
&gt; &gt; приложения, только через веб админку.
&gt; Из вот этой:
&gt; https://django-oauth-toolkit.readthedocs.io/en/2.3.0/getting_started.html ?
&gt; 
&gt; &gt; Другой вопрос, с нехешированным client_secret (до записи его в БД) реквест с
&gt; &gt; ним для авторизации клиента (получить access_token) происходит с ошибкой
&gt; &gt; client_invalid. Если не трудно можно мне чуть пояснить, про этот мало для
&gt; &gt; меня знакомый MVT
&gt; Скорее всего, проблема в том же (не применены настройки).

Использовал эту инструкцию https://django-oauth-toolkit.readthedocs.io/en/2.3.0/getting_started.html</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>273294</commentid>
    <comment_count>8</comment_count>
    <who name="Alexander Burmatov">burmatov202002</who>
    <bug_when>2025-09-26 17:04:47 +0300</bug_when>
    <thetext>&gt; &gt; Скорее всего, проблема в том же (не применены настройки).
&gt; Я выполнил проверку с применением настроек через веб интерфейс и получаю
&gt; ошибку invalid_client 
Это разные настройки, я про Django settings.
&gt; Не получаю эту ошибку, если стираю данные client_secret руками
Ваши настройки из setings.py не применены, дело в этом.</thetext>
  </long_desc>
      
      

    </bug>

</bugzilla>