Процесс авторизации OAuth2 для Yahoo с использованием Expo AuthSession API - PullRequest
0 голосов
/ 30 мая 2020

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...