170 похожих чатов

Всем привет! Возникла проблема: использую библиотеку authlib для работы с

нашим OAuth2-сервером.
Но есть нюанс.
Вот код одного из классов:
https://github.com/lepture/authlib/blob/master/authlib/oauth2/rfc6749/wrappers.py#L9
def __init__(self, params):
if params.get('expires_at'):
params['expires_at'] = int(params['expires_at'])
elif params.get('expires_in'):
params['expires_at'] = int(time.time()) + \
int(params['expires_in'])
super(OAuth2Token, self).__init__(params)

Наш собственный OAuth2-сервер написан кривовато, и отдаёт поле expires_at как строку в ISO-формате, а не как unixtime.
Решение-то простое:
params['expires_at'] = int(datetime.strptime(params['expires_at'], '%Y-%m-%dT%H:%M:%S').timestamp())

Но я теперь не понимаю, как подменить исходный объект новым.
Что пробовал:
1. Сделать класс MockedOAuth2Token и попробовать подменить:
oauth2.rfc6749.wrappers.OAuth2Token = MockedOAuth2Token
Не работает

2. Переделать только __init__ и через unittest.mock запатчить.
Пробовал разными способами, тоже не работает. Ошибки больше нет, но данные пропадают по дороге, из-за чего всё бесполезно.

Есть какие-то удобные решения, кроме форка библиотеки?

2 ответов

10 просмотров
Groosha- Автор вопроса

Приложение на FastAPI. Ручка для начала авторизации: @router.get("/") async def login( request: Request, authorization: str = Cookie(default=None, alias="Authorization"), ): client = oauth.create_client("profile") redirect_uri = request.url_for('oauth_callback_get') return await client.authorize_redirect(request, redirect_uri) В момент нажатия юзером кнопки Allow: @router.get("/callback") async def oauth_callback_get(request: Request): OAuth2Client.token_auth_class = MockedOAuth2Token client = oauth.create_client("profile") client.token_auth_class = MockedOAuth2Token token = await client.authorize_access_token(request) # тут крашится из-за конвертации Что касается profile: oauth = OAuth() oauth.register( name="profile", client_id=config.client_id, client_secret=config.client_secret.get_secret_value(), authorize_url="https://our.corporate.domain/oauth/authorize", access_token_url="https://our.corporate.domain/oauth/token", client_kwargs={ "scope": "profile_user default groups" } )

Groosha- Автор вопроса
Groosha
Приложение на FastAPI. Ручка для начала авторизаци...

Решил! def profile_compiance_fix(session): def _fix(resp): resp.raise_for_status() token = resp.json() token["expires_at"] = int(datetime.strptime(token["expires_at"], "%Y-%m-%dT%H:%M:%S").timestamp()) resp._content = json.dumps(token).encode('utf-8') return resp session.register_compliance_hook('access_token_response', _fix) oauth = OAuth() oauth.register( name="profile", client_id=config.client_id, client_secret=config.client_secret.get_secret_value(), authorize_url="https://our.corporate.domain/oauth/authorize", access_token_url="https://our.corporate.domain/oauth/token", compliance_fix=profile_compiance_fix, client_kwargs={ "scope": "profile_user default groups" } ) Спасибо @Tishka17 за наводку) И вот этой еле найденной странице в доке

Похожие вопросы

Обсуждают сегодня

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
Есть вопрос: допустим есть железка с каким-то интерфейсом(допустим usb), но как по этому интерфейсу железкой управлять неизвестно, прог нету, а управлять очень хочется надо. К...
Mixail Frolov
15
а как ловят такое ghci> res <- getPos2 urlt 0 (alist !! 0) 200 ghci> res SearchAtom (Search "www.google.com" "/search?q=" "Haskell") "haskell.org" (SearchTS [(2024-05-06 07:...
Fedor
14
Так а кто может спарсить всех участников чата? Идишники
Magic
17
всем привет почти закончил курс После него можно писать свою операционку? Какие библиотеки надо использовать и куда дальше копать для изучения
Linus
13
Ребята, а из API геокодеров (по адресам в РФ) что сейчас актуального и есть ли среди актуального бесплатное/с нормаотным лимитом запросов? ситуация простая - на сайте периоди...
Dreamer_0x01 VeseloV
8
короче сгенерила мне эта штука код на ассемблере: struc string val { common local .value dq .value .value: if ~val eq db val end if db 0 } fo...
Vi Chapmann Chapmann
12
Карта сайта