Ниже приведен вызов и обратный вызов для моей реализации входа 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
Вход Apple с Fastapi, возвращающим различное состояние в ответ ⇐ IOS
Программируем под IOS
-
Anonymous
1749975488
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/authorize?response_type=code&client_id=com.xyz.web&redirect_uri=https%3A%2F%2Fapi.xyz.net%2Fauth%2Fcallback%2Fapple&scope=name+email&state=ysgzefTX59ZhDdcgpHbF3E9Z6DE914&response_mode=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
Подробнее здесь: [url]https://stackoverflow.com/questions/79664027/apple-sign-in-with-fastapi-returning-different-state-in-response[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия