angularjs - ionicons - ionic v1
La interfaz de usuario de Dropint de Braintree no funciona con Ionic Framework a menos que se actualice la fuerza (1)
Divulgación completa: trabajo en Braintree. Si tiene más preguntas, no dude en ponerse en contacto con el soporte .
El enfoque que ha publicado es extremadamente inseguro, ya que es vulnerable a la Referencia de Objeto Directo Inseguro ( OWASP Top 10 ) y puede resultar fácilmente en la carga de usuarios cruzados por parte de un usuario infame. Básicamente, has permitido que cualquier usuario use tu servidor para generar tokens de cliente para cualquier cliente.
En su lugar, solo debe generar tokens en el servidor para evitar que los agentes de usuario elijan el ID de otro usuario. A continuación, muestre las identificaciones de los clientes según el inicio de sesión con credenciales de un usuario y no permita que pasen los parámetros que se utilizarán durante la generación de ClientToken. Hay muchas guías en línea sobre cómo crear autenticación . Pero una vez que tiene el usuario creado en el servidor, puede:
if (userSession == undefined) {
//or force login if you want them to sign up for your site before buying things
gateway.clientToken.generate({}, function (err, res) {
if (err) throw err;
response.json({
"client_token": res.clientToken
});
});
} else {
console.log ("using exsiting customer!");
gateway.clientToken.generate({
customerId: userSession.user.BraintreeId
}, function (err, res) {
if (err) throw err;
response.json({
"client_token": res.clientToken
});
});
}
Hagas lo que hagas, no uses este código, tal como está, en producción. No recomendaría depurar el front-end hasta que hayas reconstruido para corregir esta vulnerabilidad, ya que el enfoque será bastante diferente. Sin embargo, si vuelve a este problema de nuevo, parece que podría haber un problema abierto relacionado con este comportamiento .
Me encuentro con un comportamiento muy extraño con Braintree dropin UI dentro de Ionic framework.
Así que utilizo la solución: No puedo crear un token de cliente Braintree con ID de cliente para crear la lógica por primera vez y el cliente de devolución.
$http({
method: ''POST'',
url: ''http://localhost:3000/api/v1/token'',
data: {
customerId: braintreeReturnCustomerId
}
})
Como pasé en el ID de cliente en mi vista de cliente. En mi servidor nodejs, tengo una lógica que verificar para ver si customerId no está definido. Si no está definido, es cliente por primera vez. Si customerId tiene valor, es un cliente de devolución. Muy sencillo como ese:
app.post(''/api/v1/token'', jsonParser, function (request, response) {
var customerId = request.body.customerId;
if (customerId == undefined) {
gateway.clientToken.generate({}, function (err, res) {
if (err) throw err;
response.json({
"client_token": res.clientToken
});
});
} else {
console.log ("using exsiting customer!");
gateway.clientToken.generate({
customerId: customerId
}, function (err, res) {
if (err) throw err;
response.json({
"client_token": res.clientToken
});
});
}
});
Mi cliente está en una vista iónica. Entonces, cuando lo pago por primera vez, sabe que es el usuario de primera vez, luego genera customerId para mí y lo almaceno en mi base de datos. Todo bien. Luego SIN refrescar (como la aplicación Ionic no se actualiza cuando cambia el estado), voy a un estado diferente y vuelvo al estado de pago, no muestra la tarjeta de crédito de la tienda. Incluso mi servidor registra el ID de cliente y sé PARA SEGURO que el código del servidor ejecuta la parte "else" con gateway.clientToken.generate ({customerId: customerId} ...
Si forzo la actualización en la vista como usar
$window.location.reload(true);
justo después del primer pago exitoso o simplemente actualizo manualmente la página en mi navegador Chrome (como estoy en Ionic Serve), la página de Dropin UI de pago mostrará la tarjeta de crédito de la tienda desde el primer pago.
Intento desactivar el almacenamiento en caché de la vista como "caché: falso". Pero no ayuda. Tengo que forzar la actualización para que Dropin UI funcione por segunda vez. Creo que es el código de JavaScript en la interfaz de usuario de dropin el que causa este problema, pero no sé cómo solucionarlo ...