Я пытаюсь получить информацию о зарегистрированном пользователе из моего приложения Android после запуска функции onRequest, когда пользователь регистрируется для учетной записи Stripe Standard Connect . Причина этого в том, что я хотел бы добавить Stripe accountId пользователя в базу данных пользователя в Firestore, чтобы я мог отслеживать, к какому пользователю привязаны учетные записи Stripe Connect.
Я видел это сообщение , которое отправляет меня на эту ссылку однако я не слишком уверен в том, как вызвать его с моей облачной функцией onRequest.
Вот мой функция облака:
const admin = require('firebase-admin');
const functions = require('firebase-functions');
admin.initializeApp(functions.config().firebase);
const stripeToken = require('stripe')(functions.config().stripe.token);
const express = require('express');
const cors = require('cors');
const cookieParser = require('cookie-parser')();
const app = express();
app.use(cors({ origin: true }));
exports.stripeCreateOathResponseToken = functions.https.onRequest((req, res) => {
let rawbody = req.rawBody;
console.log("rawbody: " + rawbody); // <-- usually comes back with req.rawbody
console.log("request.body.account: " + req.body.account); // <-- returns stripe account number
return stripeToken.oauth.token({
grant_type: 'authorization_code',
code: req.query.code, //<-- works with onRequest ((req, res)
}).then(function (response) {
return res.redirect('http://MyWebSite.com/') //<-- works with onRequest
})
.then(function(response){
return addAccountToFirebase() //<-- shows error in firebase log but still executes
// error: Error: Can't set headers after they are sent.
return exports.app; // shows error: Error: Can't set headers after they are sent.
})
.catch(error => {
res.send(error)
})
});
function addAccountToFirebase(user) {
user = stripeToken.auth().customer.email
return admin.firestore().collection('Users').doc(user.email).update({userStripeCusId: customer.id});
}
код с веб-сайта firebase декодирование и проверка токена userID
// Express middleware that validates Firebase ID Tokens passed in the Authorization HTTP header.
// The Firebase ID token needs to be passed as a Bearer token in the Authorization HTTP header like this:
// `Authorization: Bearer <Firebase ID Token>`.
// when decoded successfully, the ID Token content will be added as `req.user`.
const validateFirebaseIdToken = async (req, res, next) => {
console.log('Check if request is authorized with Firebase ID token');
if ((!req.headers.authorization || !req.headers.authorization.startsWith('Bearer ')) &&
!(req.cookies && req.cookies.__session)) {
console.error('No Firebase ID token was passed as a Bearer token in the Authorization header.',
'Make sure you authorize your request by providing the following HTTP header:',
'Authorization: Bearer <Firebase ID Token>',
'or by passing a "__session" cookie.');
res.status(403).send('Unauthorized');
return;
}
let idToken;
if (req.headers.authorization && req.headers.authorization.startsWith('Bearer ')) {
console.log('Found "Authorization" header');
// Read the ID Token from the Authorization header.
idToken = req.headers.authorization.split('Bearer ')[1];
} else if(req.cookies) {
console.log('Found "__session" cookie');
// Read the ID Token from cookie.
idToken = req.cookies.__session;
} else {
// No cookie
res.status(403).send('Unauthorized');
return;
}
try {
const decodedIdToken = await admin.auth().verifyIdToken(idToken);
console.log('ID Token correctly decoded', decodedIdToken);
req.user = decodedIdToken;
console.log("req.user: " + req.user + " from exports.app")
next();
return;
} catch (error) {
console.error('Error while verifying Firebase ID token:', error);
res.status(403).send('Unauthorized');
return;
}
};
app.use(cors);
app.use(cookieParser);
app.use(validateFirebaseIdToken);
exports.app = functions.https.onRequest(app);
Вот пример того, как я ' может добавить идентификатор клиента Stripe с помощью onCreate Call
// When a user is created, register them with Stripe
exports.createStripeCustomerOG = functions.auth.user().onCreate(async (user) => {
const customer = await stripeToken.customers.create({email: user.email});
return admin.firestore().collection('Users').doc(user.email).update({userStripeCusId: customer.id});
});