Expo SDK Версия: 37.0.3 Платформы (Android / iOS / web / all): iOS
Здравствуйте, я пытаюсь создать приложение для фэнтези-баскетбола на основе Yahoo Fantasy API. Я пытаюсь использовать AuthSession API из expo, чтобы выполнить процесс проверки подлинности OAuth, указанный здесь . Я могу получить код авторизации от Yahoo после того, как пользователь аутентифицируется с помощью AuthSession, затем мне нужно взять этот код и отправить его в конечную точку OAuth 2.0 Token: с помощью метода HTTP Post. Я отправляю данные с помощью выборки и получаю сообщение об ошибке ниже:
{"error": "INVALID_AUTHORIZATION_CODE", "error_description": "Код авторизации OAuth истек или недействителен",}
Я вставил свой код для функции signIn () ниже. Пожалуйста, дайте мне знать, есть ли у вас какие-либо указания относительно того, как я могу исправить эту ошибку и получить токен доступа.
import React, { useEffect, useState } from 'react';
import {View, Text, TouchableOpacity, Alert } from 'react-native';
import * as WebBrowser from 'expo-web-browser';
import { makeRedirectUri, useAuthRequest } from 'expo-auth-session';
import { Base64 } from 'js-base64';
const useProxy = true;
const redirectUri = makeRedirectUri({ useProxy });
const CLIENT_ID = *scrambledcleintid*
const CLIENT_SECRET = *scrambledclientsecret*
function SignIn({ navigation }) {
WebBrowser.maybeCompleteAuthSession();
var code;
const discovery = {
authorizationEndpoint: 'https://api.login.yahoo.com/oauth2/request_auth',
tokenEndpoint: 'https://api.login.yahoo.com/oauth2/get_token'
};
//request
const [request, result, promptAsync] = useAuthRequest({
clientId: CLIENT_ID,
clientSecret: CLIENT_SECRET,
scopes: ["openid"],
responseType:'code',
redirectUri, //will likely need to change for production
extraParams: {
// ideally, this will be a random value
nonce: "nonce",
},
},discovery);
useEffect(() => {
if (result) {
if (result.error) {
Alert.alert(
"Authentication error",
result.params.error_description || "something went wrong"
);
return;
}
if (result.type === "success") {
code = result.params.code;
getTokens();
//const { name } = code;
//setName(name);
}
}
}, [result]);
const getTokens = async () => {
try {
const authcode = Base64.encode(`${CLIENT_ID}:${CLIENT_SECRET}`);
const bodystr = `code=${code}&grant_type=authorization_code&redirect_uri=${redirectUri}`;
const response = await fetch('https://api.login.yahoo.com/oauth2/get_token', {
method: 'POST',
headers: {
Authorization : `Basic ${authcode}`,
'Content-Type' : 'application/x-www-form-urlencoded',
},
body: bodystr
});
const responseJson = await response.json();
} catch (err) {
console.error(err);
}
}
return (
<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}>
<Text>Sign In screen</Text>
<TouchableOpacity
style = {styles.button}
onPress={() => promptAsync({ useProxy, redirectUri })}>
<Text style={styles.buttonText}>Sign In</Text>
</TouchableOpacity>
</View>
);
}
export default SignIn;