Я разрабатываю мобильное приложение с использованием React Native. На этом этапе я пытаюсь подключить его к своим API (созданным с использованием FastAPI с Authlib) для выполнения аутентификации с помощью Google.
Я не знаю, правильно ли я реализовал аутентификацию Google, но из браузера токен доступа генерируется без проблем.
Когда я пытаюсь выполнить вход в свое приложение с помощью библиотеки expo-web-browser, я получаю предупреждение CSFR, поскольку состояние в запросе отличается от состояния в ответ. Я читал, что причина этого в том, что браузер, открытый при помощи expo, не сохраняет файлы cookie.
Мне интересно, есть ли способ решить эту проблему.
Выдается следующее сообщение об ошибке:
mismatching_state: CSFR Внимание! Состояние не равно в запросе и ответе.
Код для разделов API и React Native:
config_data = {
'GOOGLE_CLIENT_ID': GOOGLE_CLIENT_ID,
'GOOGLE_CLIENT_SECRET': GOOGLE_CLIENT_SECRET
}
starlette_config = Config(environ=config_data)
oauth = OAuth(starlette_config)
oauth.register(
name='google',
server_metadata_url='https://accounts.google.com/.well-known ... figuration',
client_kwargs={'scope': 'openid email profile', 'verify': False}
)
@router.get('/login')
async def google_login(req: Request):
"""Returns a redirect to the google login page
Args:
req (Request): The inoming request
Returns:
RedirectResponse: a redirect to google login page
"""
return await oauth.google.authorize_redirect(req, GOOGLE_REDIRECT_URI)
@router.get('/callback', status_code=status.HTTP_200_OK, response_model=Token)
async def google_callback(req: Request, db = Depends(get_db)):
"""Callback endpoint from google login page to generate the access token
Args:
req (Request): The incoming request
db (Session, optional): a active database session. Defaults to Depends(get_db).
Raises:
HTTPException: 401 in case the access token can't be generated
Returns:
Token: The access token
"""
try:
user_response: OAuth2Token = await oauth.google.authorize_access_token(req)
except OAuthError as e:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail=f'could not validate credentials: {e}'
)
...
return RedirectResponse(
f'.../google-callback?token={token}'
)
const handleGoogleLogin = async () => {
const redirectUrl = Linking.createURL('/google-callback')
let result = await WebBrowser.openAuthSessionAsync(
`${API_URL}/google/login`,
redirectUrl
)
if(result.type === 'success' && result.url) {
const token = result.url.split('token=b')[1]
if(token) {
await AsyncStorage.setItem('access_token', token)
setIsAuthenticated(true)
}
}
};
Подробнее здесь: https://stackoverflow.com/questions/797 ... th-own-api