Я пытался создать собственное приложение для реагирования, которое требует, чтобы пользователи аутентифицировались в своей учетной записи Instagram. В Instagram API есть ссылка для авторизации, и, возможно, единственный способ отобразить ее в приложении - через WebView, поэтому я использовал ее.
Рабочий процесс аутентификации проходит гладко, а затем мой сервер даже получает токен доступа и идентификатор пользователя. Но проблема в том, как отправить этот токен доступа обратно в приложение? Я использовал express-js для «redirect-uri», поэтому WebView отправляет запрос обработчику app.get (). Чтобы отправить ответ тому же клиенту, на котором открыто соединение, мы должны использовать res.send (). Это отправит ответ в WebView, скажем, я захватил это с помощью injectedJavaScript, но этот javascript работает в WebView, и поэтому он не может получить доступ к собственным переменным реакции. В случае правильного токена доступа, как я смогу уйти от WebView?
Мы будем очень благодарны за любые решения вышеуказанных проблем. Я подозреваю, что с этим подходом могут даже возникнуть проблемы (при выборе WebView для этой цели и т. д.), Поэтому даже полное изменение подхода также может помочь. Все, что я хочу, - это аутентифицировать пользователей приложения в Instagram и запустить мой проект. Большое спасибо.
Один из способов добиться этого - использовать deeplink. Я не думаю, что это лучшая практика.
Ответ от WebView будет отправлен на URL-адрес перенаправления, который вы ранее установили после успешной аутентификации. Установите URL-адрес перенаправления для своего приложения. Например, в iOS, если у вас есть схема URL как «myapp123», то каждый раз, когда вы открываете браузер и набираете myapp123: // .., оно откроет ваше приложение, и ваше приложение должно иметь возможность получать ответ, отправленный из instagram.
Если вы используете Expo, вы можете использовать AuthSessions для этого (https://docs.expo.io/versions/latest/sdk/auth-session). Точный способ сделать это зависит от того, используете ли вы управляемый рабочий процесс или простой рабочий процесс и т. д., Но для управляемого рабочего процесса вы можете сделать следующее:
https://auth.expo.io/@your-expo-username/your-project-slug
(слаг проекта находится в вашем файле app.json
).expo install expo-auth-session
и импортируйте его в свой компонент.expo-web-browser
import React, { useEffect } from 'react';
import { Button, Platform, Text, TouchableOpacity, View } from 'react-native';
import * as WebBrowser from 'expo-web-browser';
import { useAuthRequest, makeRedirectUri } from 'expo-auth-session';
WebBrowser.maybeCompleteAuthSession(); // <-- will close web window after authentication
const useProxy = Platform.select({ web: false, default: true });
const client_id = 9999999999999;
const redirect_uri = "https://auth.expo.io/@your-expo-username/your-project-slug";
const scope = "user_profile,user_media";
const site = "https://api.instagram.com/oauth/authorize?client_id = " + client_id + "&redirect_uri = " + redirect_uri + "&scope = " + scope + "&response_type=code&state=1";
const discovery = { authorizationEndpoint: site }
const GetInstagram = () => {
const [request, response, promptAsync] = useAuthRequest({
redirectUri: makeRedirectUri({
useProxy,
native: redirect_uri
}),
scopes: [scope],
clientId: client_id
}, discovery);
useEffect(() => {
if (response?.type === 'success') {
const { code } = response.params; <--- the IG code will be returned here
console.info("code : ", code);
}
}, [response]);
return (
<View>
<TouchableOpacity onPress = { () => promptAsync({useProxy,windowFeatures: { width: 700, height: 600 }}) }>
<Text>Connect Your Instagram</Text>
</TouchableOpacity>
</View>
)
}
export default GetInstagram;