Devolver el código de autorización a Stripe mediante la función HTTP de Firebase (Firebase, Stripe OAuth, interfaz de React (JSX))
Tengo un front-end de React, un back-end de Firebase que intenta completar el proceso de Stripe OAuth. El URI de redireccionamiento ha vuelto (volviendo ahttps://mywebsitename.com/oauth_return) y el componente de reacción que tengo abriendo en esa página analiza esa URL y accede al código de autenticación y al estado. (por favor ver más abajo)
dentro del archivo "oauth_return.js"
import React from 'react';
import queryString from 'query-string';
const oauth_redirect = () => {
//Parsing over URL
const value=queryString.parse(window.location.search);
const code=value.code;
console.log('code:', code)
const state=value.state;
console.log('state:', state)
}
export default (oauth_redirect)
Lo que tengo dificultades para hacer es intentar averiguar cómo hacer que la función HTTP de Firebase devuelva el código de autenticación a través de un método POST. Todas mis funciones de base de fuego existen dentro del archivo "index.js" del directorio de funciones. Todos los tutoriales que he visto muestran varias formas de construir esta función en Typecript, pero mi código debe estar escrito en Javascript.
dentro del archivo "functions / index.js"
(...)
exports.stripeCreateOathResponseToken = functions.https.onRequest((req, res) => {
(...) Not sure what to write in this function to return the authorization code. All tutorials I've found are written in Typescript.
});
Desafortunadamente, no entiendo cómo se puede activar esta función HTTP para que se llame en primer lugar (es decir, ¿necesito llamarla explícitamente dentro del archivo "oauth_return.js"? ¿Cómo le paso el código de autorización? lo que es más importante, ¿cómo devuelve el código de autorización a Stripe?
Se agradecería mucho cualquier aclaración sobre este tema.
Respuestas
Aquí está el código de trabajo escrito para un propósito exacto como el suyo. Espero que esto le ayude a proporcionar una solución.
exports.stripeCreateOathResponseToken = functions.https.onRequest((req, res) => {
res.set('Access-Control-Allow-Origin', '*');
if (req.method === 'OPTIONS') {
console.log('Executing OPTIONS request code block');
res.set('Access-Control-Allow-Methods', 'POST');
res.set('Access-Control-Allow-Headers', 'Origin, Content-Type, Accept');
res.set('Access-Control-Max-Age', '3600');
res.status(204).send('');
} else if (req.method === 'POST') {
console.log('Executing POST request code block');
return oauthResponseCheck(req, res);
}
else {
// Log, but ignore requests which are not OPTIONS or POST.
console.log(`We received an invalid request method of type: ${req.method}`);
return;
}
});
function oauthResponseCheck(req, res) {
// code: An authorization code you can use in the next call to get an access token for your user.
// This can only be used once and expires in 5 minutes.
// state: The value of the state parameter you provided on the initial POST request.
const { code, state } = req.body;
// Assert the state matches the state you provided in the OAuth link (optional).
if (!stateMatches(state)) {
console.log('Incorrect state parameter for state::', state)
return res.status(403).json({ error: 'Incorrect state parameter: ' + state });
}
// Send the authorization code to Stripe's API.
stripe.oauth.token({
grant_type: 'authorization_code',
code
}).then(
(response) => {
var stripe_connected_account_id = response.stripe_user_id;
console.log('Stripe Connected Account Saved successfully: ' + JSON.stringify(response));
return res.status(200).json({
status: true,
message: 'Stripe Connected Account Saved successfully',
data: response
});
},
(err) => {
if (err.type === 'StripeInvalidGrantError') {
console.log('Invalid authorization code: ' + code);
return res.status(400).json({
status: false,
message: 'Invalid authorization code.::' + code,
}
);
} else {
console.log('An unknown error occurred: ' + err);
return res.status(500).json({
status: false,
message: 'An unknown error occurred.::' + err,
});
}
}
);
})