Angularjs 除非强制刷新,否则Braintree Dropin UI不适用于离子框架

Angularjs 除非强制刷新,否则Braintree Dropin UI不适用于离子框架,angularjs,paypal,ionic-framework,braintree,Angularjs,Paypal,Ionic Framework,Braintree,我在Ionic框架内遇到了Braintree dropin UI的一个非常奇怪的行为 因此,我使用以下解决方案: 第一次创建逻辑并返回客户 $http({ method: 'POST', url: 'http://localhost:3000/api/v1/token', data: { customerId: braintreeReturnCustomerId } }) 当

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

因此,我使用以下解决方案: 第一次创建逻辑并返回客户

$http({
          method: 'POST',
          url: 'http://localhost:3000/api/v1/token',
          data: {
            customerId: braintreeReturnCustomerId
          }
        })
当我在客户端视图中传入customerId时。在我的nodejs服务器中,我有一个逻辑来检查customerId是否未定义。如果未定义,则为首次客户。如果customerId有值,则返回customer。非常直截了当地说:

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


 });
我的客户是爱奥尼亚式的。所以,当我第一次付款时,它知道这是第一次使用它,然后为我生成customerId,我将它存储在我的数据库中。一切都好。然后在不刷新的情况下(因为Ionic app在状态更改时不会刷新),我会转到另一个状态并返回到支付状态,它不会显示商店信用卡。甚至我的服务器也会记录customerId,我确信服务器代码正在使用gateway.clientToken.generate({customerId:customerId})运行“else”部分

如果我像使用

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

我尝试禁用视图缓存,如“cache:false”。但这没有帮助。我必须强制刷新以使Dropin UI第二次工作。我认为是Dropin UI中的javascript代码导致了此问题,但我不知道如何解决它…

完全披露:我在Braintree工作。如果您有任何进一步的问题,请随时联系

您发布的方法非常不安全,因为它易受()攻击,并且很容易导致恶意用户跨用户收费。您基本上允许任何用户使用您的服务器为任何客户生成客户端令牌

$http({
          method: 'POST',
          url: 'http://localhost:3000/api/v1/token',
          data: {
            customerId: braintreeReturnCustomerId
          }
        })
相反,您应该只在服务器上生成令牌,以避免用户代理选择另一个用户的id。然后根据用户的认证登录提供客户id,并且不允许他们传入在clientToken生成过程中使用的参数。有。但是,一旦在服务器上创建了用户,您可以:

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

无论您做什么,都不要像在生产中一样使用此代码。我不建议您在重新构建以修复此漏洞之前调试前端,因为方法将非常不同。但是,如果您再次遇到此问题,它看起来可能会出现。

哇。感谢您指出此问题。但我不做任何服务器操作侧面身份验证b/c我使用Firebase。下面是我解决这个问题的解决方案:您能告诉我这种Firebase方法是否符合OWASP标准吗?@Hughou,虽然我对Firebase没有经验,但引入一个可信的第三方来执行身份验证/id生成类似于让您自己的服务器生成/存储此信息信息。我不能对您的具体实现发表评论,但一般来说,这是避免客户生成/伪造客户ID的一个不错的方向。