Restituzione del codice di autorizzazione a Stripe utilizzando la funzione HTTP Firebase (frontend Firebase, Stripe OAuth, React (JSX))
Ho un front-end React, un back-end Firebase che prova a completare il processo Stripe OAuth. L'URI di reindirizzamento è tornato (tornando ahttps://mywebsitename.com/oauth_return) e il componente di reazione che ho aperto su quella pagina analizza quell'URL e accede al codice di autenticazione e allo stato. (vedi sotto)
all'interno del file "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)
Quello che ho difficoltà a fare è cercare di capire come fare in modo che la funzione HTTP di Firebase restituisca il codice di autenticazione tramite un metodo POST. Tutte le mie funzioni Firebase esistono all'interno del file "index.js" della directory delle funzioni. Tutti i tutorial che ho visto mostrano vari modi per costruire questa funzione in Typescript, ma il mio codice deve essere scritto in Javascript.
all'interno del file "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.
});
Sfortunatamente non capisco come si possa innescare questa funzione HTTP per essere chiamata in primo luogo (cioè devo chiamarla esplicitamente all'interno del file "oauth_return.js"? Come faccio a passarvi il codice di autorizzazione? E la maggior parte cosa importante, come restituisce il codice di autorizzazione a Stripe?
Qualsiasi chiarezza su questo tema sarebbe molto apprezzata.
Risposte
Ecco il codice funzionante scritto per uno scopo preciso come il tuo. Spero che questo ti aiuti a fornire una soluzione.
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,
});
}
}
);
})