【问题标题】:Passing parameters to the server (oAuth callback in Stripe Connect)将参数传递给服务器(Stripe Connect 中的 oAuth 回调)
【发布时间】:2016-01-16 22:00:39
【问题描述】:

我正在按照here(独立帐户)的说明设置 Stripe Connect。我在我的节点服务器上处理access_token 的授权和检索。

用户可以访问链接MY_SERVER_URI/authorize,并将被重定向到预定义的条带AUTHORIZE_URI

app.get("/authorize", function(req, res) {
  // Redirect to Stripe /oauth/authorize endpoint
  res.redirect(AUTHORIZE_URI + "?" + qs.stringify({
    response_type: "code",
    scope: "read_write",
    client_id: CLIENT_ID
  }));
});

用户授权 Stripe Connect 后,他或她将被重定向到预定义的 REDIRECT_URI,在这种情况下等于 MY_SERVER_URI/oauth/callback,其中执行以下脚本:

app.get("/oauth/callback", function(req, res) {

  var code = req.query.code;

  // Make /oauth/token endpoint POST request
  request.post({
    url: TOKEN_URI,
    form: {
      grant_type: "authorization_code",
      client_id: CLIENT_ID,
      code: code,
      client_secret: API_KEY
    }
  }, function(err, r, body) {

    var accessToken = JSON.parse(body).access_token;

    // Do something with your accessToken

    // For demo"s sake, output in response:
    res.send({ "Your Token": accessToken });

  });
});

现在这里一切正常,应用程序能够获取accessToken。但是,此accessToken 需要保存并与从客户端授予访问权限的用户匹配。

因此,我的问题归结为,如何在 oauth/callback GET 请求中传递客户端参数(如客户端 userId),或在客户端处理服务器处理(例如 $http GET 请求而不是访问 uri)?我猜后者不是推荐的选项。

我做了两次尝试:

  • 我尝试使用动态REDIRECT_URI 传递参数,但是 问题是Stripe要求需要指定所有网址 首先(导致重定向中不能传参数 网址)。
  • 我尝试使用$http GET 请求访问MY_STRIPE_URI/authorize,但这给了我一个明显的错误请求的资源上没有“Access-Control-Allow-Origin”标头时间>

可以做什么?

【问题讨论】:

    标签: javascript angularjs node.js oauth stripe-payments


    【解决方案1】:

    您必须将您的用户 ID 作为“状态”参数传递,Stripe 将在回调中返回它。我发现避免会话的唯一方法

    【讨论】:

    • 我不会将用户 ID 作为“状态”传递,而是为您的用户传递某种标识令牌。否则,当我被重定向到创建我的条带帐户时,我可以用 connect.stripe.com/oauth/… 替换 url connect.stripe.com/oauth/…,我的令牌将注册到用户 2 而不是用户 1
    • 您可以使用 JWT github.com/auth0/node-jsonwebtoken 之类的东西来插入有效负载(在这种情况下为变量的 json 对象),同时保证安全。如果您使用云功能并且没有会话状态,这很有效
    【解决方案2】:

    一般你的场景如下:

    1. 向服务器上的某些路由发出请求并将用户的 ID 存储在那里:req.session.user = {id: '...'}
    2. 从该路由将用户重定向到第三方授权 URL
    3. 在您接收访问令牌的路径中,也将其存储在会话中:req.session.user.access_token = '...'
    4. 将该访问令牌用于对 Stripe API 的后续请求

    注意:

    1. 不要尝试破解 authorization_code OAuth 流程
    2. 您可能会发现 Grant 更易于用于该类型的 OAuth 流,支持 Stripe
    3. 相关comment

    【讨论】:

    • 听起来很有希望。但是,我收到错误:TypeError: Cannot set property 'user' of undefined (there is no req.session??)
    • 嗯,你需要先挂载默认的session middleware或类似的。
    猜你喜欢
    • 1970-01-01
    • 2016-12-09
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多