Неверный клиент в django-oauth-toolkit v2, который был верен в v1

Я выполняю сезонные обновления в проекте и заметил, что django-oauth-toolkit остался на 1.7.1 в прошлый раз.

Обновление до версии 2.x превращает два теста из 200 в 401, invalid_client.

Один из этих тестов выглядит следующим образом;

@pytest.fixture
def oauth_data(db):
    test_region = Region.objects.create(
        name="MyRegion", iso_code_short="MYR", iso_code_long="MYREG"
    )
    app_owner = USER_MODEL(
        username="app-owner",
        email="owner@somewhere.com",
        gender="M",
        date_of_birth="1970-1-1",
        region=test_region,
        first_name="John",
        last_name="Doe",
    )
    app_owner.set_password("password")
    app_owner.save()

    app_redirects = "http://site1.com/return\r\nhttp://site2.com/back"
    app = Application.objects.create(
        name="My Test Client",
        client_id="test-app",
        client_secret="password",
        client_type=Application.CLIENT_CONFIDENTIAL,
        authorization_grant_type=Application.GRANT_PASSWORD,
        user=app_owner,
        skip_authorization=True,
        redirect_uris=app_redirects,
    )
    return {"app": app, "app_owner": app_owner}


# some test class here...

    def (
        self, oauth_data, client, settings
    ):
        mixin = AccessTokenGeneratorMixin()
        tokens = mixin.get_access_token(oauth_data["app"], oauth_data["user"])

        url = reverse("oauth2_provider:token")
        response = client.post(
            url,
            data={
                "client_id": oauth_data["app"].client_id,
                "client_secret": oauth_data["app"].client_secret,
                "grant_type": "refresh_token",
                "refresh_token": tokens["refresh_token"],
            },
        )
        assert 200 == response.status_code

Есть ли что-то в v2 (что я пропустил в примечаниях к выпуску), что делает недействительным это приспособление для создания недействительного клиента!?

Это был случай не очень хорошего чтения чужого кода.

В версии 2 клиентские секреты хэшируются в базе данных, поэтому хэшированное значение не сможет правильно идентифицировать клиентское приложение при выполнении;

"client_secret": oauth_data["app"].client_secret,

Решением здесь является использование того же значения, которое устанавливает client_secret приложение при отправке данных в конечную точку токена.

@pytest.fixture
def oauth_data(db):
    client_secret = "abcdefghijklmnopqrstuvwxyz1234567890"
    test_region = Region.objects.create(
        name="MyRegion", iso_code_short="MYR", iso_code_long="MYREG"
    )
    app_owner = USER_MODEL(
        username="app-owner",
        email="owner@somewhere.com",
        gender="M",
        date_of_birth="1970-1-1",
        region=test_region,
        first_name="John",
        last_name="Doe",
    )
    app_owner.set_password("password")
    app_owner.save()

    app_redirects = "http://site1.com/return\r\nhttp://site2.com/back"
    app = Application.objects.create(
        name="My Test Client",
        client_id="test-app",
        client_secret=client_secret,
        client_type=Application.CLIENT_CONFIDENTIAL,
        authorization_grant_type=Application.GRANT_PASSWORD,
        user=app_owner,
        skip_authorization=True,
        redirect_uris=app_redirects,
    )
    return {
        "app": app,
        "app_owner": app_owner,
        "client_secret": client_secret,
    }

# into a class

    def test_oauth2_access_token_renewal_format(
        self, oauth_data, client, settings
    ):
        mixin = AccessTokenGeneratorMixin()
        tokens = mixin.get_access_token(oauth_data["app"], oauth_data["user"])

        url = reverse("oauth2_provider:token")
        response = client.post(
            url,
            data={
                "client_id": oauth_data["app"].client_id,
                "client_secret": oauth_data["client_secret"],
                "grant_type": "refresh_token",
                "refresh_token": tokens["refresh_token"],
            },
        )
        assert 200 == response.status_code
Вернуться на верх