angularjs - Braintree Dropin UI 无法与 Ionic Framework 一起使用,除非强制刷新

标签 angularjs paypal ionic-framework braintree

我在 Ionic 框架内使用 Braintree dropin UI 时遇到了一个非常奇怪的行为。

所以我使用解决方案:Can't create Braintree client token with customer ID 创建首次和回头客的逻辑。

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

当我在客户端 View 中传入 customerId 时。在我的 Nodejs 服务器中,我有一个逻辑来检查 customerId 是否未定义。如果未定义,则为首次客户。如果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
     });
   });
 }


 });

我的客户处于 Ionic View 中。因此,当我第一次付款时,它知道这是第一次用户,然后为我生成 customerId 并将其存储在我的数据库中。都好。然后,在不刷新的情况下(因为 Ionic 应用程序在状态更改时不会刷新),我会转到不同的状态并返回到付款状态,它不会显示商店信用卡。即使我的服务器记录了 customerId,我也确信服务器代码正在使用 gateway.clientToken.generate({customerId: customerId} ...

如果我像使用一样在 View 中强制刷新

$window.location.reload(true);

第一次付款成功后,或者我只是在 chrome 浏览器中手动刷新页面(就像我在 Ionic Serve 中一样),付款 Dropin UI 页面将显示第一次付款时的商店信用卡。

我尝试禁用 View 缓存,例如“cache: false”。但这没有帮助。我必须强制刷新才能使 Dropin UI 再次工作。我认为这是 dropin UI 中的 javascript 代码导致了这个问题,但我不知道如何修复它......

最佳答案

全面披露:我在 Braintree 工作。如果您还有任何疑问,请随时联系support .

您发布的方法非常不安全,因为它容易受到 Insecure Direct Object Reference 的攻击。 ( OWASP Top 10 ) 并且很容易导致恶意用户进行跨用户收费。您实质上已允许任何用户使用您的服务器为任何客户生成客户端 token 。

相反,您应该只在服务器上生成 token ,以避免用户代理选择其他用户的 ID。然后根据用户的凭据登录提供客户 ID,并不允许他们传入在 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 .

关于angularjs - Braintree Dropin UI 无法与 Ionic Framework 一起使用,除非强制刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32531662/

相关文章:

javascript - 无法定义回调时使用angularjs JSONP

php - 不工作重复 Paypal 沙箱

ionic-framework - npm 警告已弃用 browserslist@2.11.3 : Browserslist 2 could fail on reading Browserslist >3. 0

css - Ionic 3 ionic 单选按钮使用 flex 彼此靠近显示选项

ios - 错误内部导航被拒绝 - <allow-navigation> IN

javascript - angular 中的 ngRequired 和自定义指令

javascript - 在 ngRoute 中使用嵌套 Controller - AngularJS

javascript - Angular 1.4.3 中的 $http 简写和简写有什么区别?

PHP执行命令 "at"运行SQL查询问题

ruby-on-rails - 当 PayPal 发布到 'return' url 时,如何阻止 Devise 注销我的用户?