Неверный клиент в 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