Вход Apple с Fastapi, возвращающим различное состояние в ответIOS

Программируем под IOS
Ответить
Anonymous
 Вход Apple с Fastapi, возвращающим различное состояние в ответ

Сообщение Anonymous »

Ниже приведен вызов и обратный вызов для моей реализации входа Apple.async def login_with_apple(request):
logger.debug(f"Session before Apple login: {request.session}")
redirect_uri = Config.APPLE_REDIRECT_URI
return await oauth.apple.authorize_redirect(request, redirect_uri)

async def apple_callback(request):
logger.debug(f"Session at Apple callback: {request.session}")
try:
token = await oauth.apple.authorize_access_token(request)
...

Это выбрасывает ошибку CSRF (состояние несоответствия), потому что session.state до того, как логин Apple отличается от возврата. Нет многочисленных вызовов, которые могут вызвать это, просто один вызов Apple каждый раз.app.add_middleware(
SessionMiddleware,
secret_key=Config.SECRET_KEY,
session_cookie="session",
https_only=True,
same_site="none",
domain=".xyz.net",
)

и настроил домен xyz.net и субдомен API.xyz.net с моим идентификатором службы Apple, а URL -адрес redirect является правильным. Приведенная ниже сеанс идентична той, которая отправлена, за исключением состояния сеанса. < /P>
Session at Apple callback: {'_state_apple_ysgzefTXafasd3E9Z6DE914': {'data': {'redirect_uri': 'https://api.xyz.net/auth/callback/apple', 'url': 'https://appleid.apple.com/auth/authoriz ... =form_post'}, 'exp': 1749759103.7634718}}

Кроме того, я генерирую секрет клиента для использования в oauth.register . Кажется необычным, потому что с подписью Google в секрете статический: < /p>
# Apple OAuth
oauth.register(
name="apple",
client_id=Config.APPLE_CLIENT_ID,
client_secret=generate_apple_client_secret(),
authorize_url="https://appleid.apple.com/auth/authorize",
access_token_url="https://appleid.apple.com/auth/token",
api_base_url="https://appleid.apple.com",
client_kwargs={
"scope": "name email",
"response_mode": "form_post",
"response_type": "code",
},
)
< /code>
Это генеративная функция: < /p>
def generate_apple_client_secret():
headers = {
"kid": Config.APPLE_KEY_ID,
"alg": "ES256"
}
payload = {
"iss": Config.APPLE_TEAM_ID,
"iat": int(datetime.utcnow().timestamp()),
"exp": int((datetime.utcnow() + timedelta(days=180)).timestamp()),
"aud": "https://appleid.apple.com",
"sub": Config.APPLE_CLIENT_ID,
}
client_secret = jwt.encode(
payload,
Config.APPLE_PRIVATE_KEY,
algorithm="ES256",
headers=headers
)
return client_secret


Подробнее здесь: https://stackoverflow.com/questions/796 ... n-response
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»