Я разрабатываю мобильное приложение с использованием 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
Выполните вход в Google в собственном приложении с собственным API. ⇐ Javascript
Форум по Javascript
-
Anonymous
1760990431
Anonymous
Я разрабатываю мобильное приложение с использованием 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/openid-configuration',
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)
}
}
};
Подробнее здесь: [url]https://stackoverflow.com/questions/79795247/perform-google-login-in-react-native-app-with-own-api[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия