2015-09-11 2 views
2

Я сталкиваюсь с очень странным поведением с пользовательским интерфейсом Braintree dropin Ion.Пользовательский интерфейс Braintree Dropin не работает с Ionic Framework, если не обновляется сила

Поэтому я использую решение: Can't create Braintree client token with customer ID , чтобы создать логику в первый раз и вернуть клиента.

$http({ 
      method: 'POST', 
      url: 'http://localhost:3000/api/v1/token', 
      data: { 
      customerId: braintreeReturnCustomerId 
      } 
     }) 

Как я прошел в customerId на моем клиенте. На моем сервере nodejs у меня есть логика, чтобы проверить, не является ли clientId неопределенным. Если он не определен, это первый раз клиент. Если customerId имеет значение, он обратный клиент. Очень прямолинейно:

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 
    }); 
    }); 
} 


}); 

Мой клиент находится в Ионном представлении. Поэтому, когда я плачу в первый раз, он знает, что это пользователь времени frist, а затем генерирует customerId для меня, и я храню его в своей базе данных. Все хорошо. Затем БЕЗ обновления (поскольку приложение Ionic не обновляется при изменении состояния), я перехожу в другое состояние и возвращаюсь в состояние оплаты, оно не отображает кредитную карту магазина. Даже мой сервер регистрирует clientId, и я знаю. УВЕРЕН, что код сервера работает с частью else с gateway.clientToken.generate ({customerId: customerId} ...

Если я принудительно обновляю изображение, например, используя

$window.location.reload(true); 

сразу после первого платежа время успешно или я просто вручную обновить страницу в моем браузере Chrome (как я в ионическом Serve), то DROPIN страница UI платеж будет отображаться магазин кредитной карты от первого платежа времени.

Я пытаюсь отключить кеширование просмотра, например, «cache: false». Но это не помогает. Мне нужно принудительно обновить, чтобы заставить пользовательский интерфейс Dropin работать для t он второй раз. Я думаю, что это код javascript в пользовательском интерфейсе dropin, вызывающий эту проблему, но я не знаю, как это исправить ...

ответ

4

Полное раскрытие информации: Я работаю в Braintree. Если у вас есть дополнительные вопросы, не стесняйтесь обращаться к support.

подхода вы опубликовали крайне небезопасен, как она уязвима для Insecure Direct Object Reference (OWASP Top 10) и легко может привести к кросс-пользователю зарядки злонамеренного пользователя. Фактически вы позволили любому пользователю использовать ваш сервер для генерации клиентских токенов для любого клиента.

Вместо этого вы должны генерировать токены только на сервере, чтобы пользовательские агенты не выбирали идентификатор другого пользователя. Затем обслуживайте идентификаторы клиентов на основе учетных данных пользователя и не позволяйте им передавать параметры, которые будут использоваться во время генерации clientToken. Есть many guides online on how to build authentication. Но как только вы пользователь, созданный на сервере вы можете:

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 
     }); 
    }); 
} 

бы вы ни делали, не используйте этот код, как есть, в производстве. Я бы не советовал отлаживать интерфейс, пока вы не восстановите его, чтобы устранить эту уязвимость, поскольку подход будет совсем другим. Однако, если вы снова вернетесь к этой проблеме, похоже, что может быть an open issue related this behavior.

+0

Ничего себе. Спасибо, что указали на эту проблему. Но я не использую аутентификацию на стороне сервера b/c. Я использую Firebase. Вот мое решение для решения этой проблемы: http://stackoverflow.com/questions/32573992/how-to-structure-my-app-to-use-firebase-braintree-ionic-angularjs-and-a-minim Мог вы скажите мне, подходит ли этот подход Firebase к стандарту OWASP? –

+0

@HughHou, хотя у меня нет опыта работы с Firebase, введение доверенной третьей стороны для генерации аутентификации/генерации сродни тому, что ваш собственный сервер генерирует/хранит эту информацию. Я не могу прокомментировать вашу конкретную реализацию, но, как правило, это достойное направление, чтобы не создавать клиентов, генерирующих/поддельных идентификаторов клиентов. –

Смежные вопросы