【问题标题】:passing properties in callback function nodejs在回调函数nodejs中传递属性
【发布时间】:2020-05-01 18:27:18
【问题描述】:

我正在使用 paypal-rest-sdk。我面临的问题是,当我进行 authorizationUrl 调用时,我想传递一些可以在重定向 URL 中访问的参数。

下面是我的代码

 import paypal from 'paypal-rest-sdk';
 const openIdConnect = paypal.openIdConnect;

  paypal.configure({
                mode: "sandbox" 
                client_id: //MyClientId,
                client_secret: //MySecretId,
                openid_redirect_uri: `http://myRedirectionEndpoint/account/domestic/paypal/callback?state={accountId:5e8c2291d69ed1407ec86221}`
               });

  openIdConnect.authorizeUrl({scope: 'openid profile'});

添加查询参数 state 将错误显示为 invalid redirectUri

重定向后需要使用的数据的最佳传递方式是什么

【问题讨论】:

    标签: node.js redirect parameter-passing paypal-sandbox


    【解决方案1】:

    我认为您对 oauth 授权的工作方式有些误解。基本上,如果您想获取任何数据,您需要在使用回调并验证系统中的用户之后执行此操作。

    您是否见过 Google/github 等 openid 身份验证提供程序返回一些与调用方系统数据相对应的数据?这是不可能的。

    您可能将此与 webhook 混淆了,在 webhook 中,调用者系统在内部调用带有一些数据的 webhook 并捕获它。常用于支付交易。

    但身份验证略有不同。对于身份验证,有 3 个系统。

    1. 实际的身份验证提供者(Paypal/google/github)等。
    2. 身份提供者,它基本上获取个人资料数据等,除了企业系统之外,这两个系统完全一样。
    3. 调用者系统,在这种情况下是您的 NodeJS 服务。

    => 现在调用者系统调用身份验证提供程序来获取某种代码,通常是身份验证代码。这意味着用户存在于身份验证系统中,比如说 Google。

    => 然后调用者系统使用该身份验证代码调用身份提供者,检查用户是否也在身份提供者(idp)中,并且 idp 返回 access_token、id_token、refresh_token 等(正如我所说的大多数时候这些是相同的系统)。但是考虑一下亚马逊,假设您想使用您的 Google 帐户登录到 Amazon。您有一个 Google 帐户,但您没有亚马逊帐户。所以你会得到授权码,但不会得到 id_token。

    => 现在 id_token 大部分时间都包含 JWT 格式的用户的一些基本信息。但是现在 ACCESS_TOKEN 用于对您的系统(调用者系统)进行所有其他调用。现在正如我所说的 id_token 某种用户数据。您可以在 NodeJs 服务中使用 db 表映射用户 ID 和帐号。

    => 制作一个端点来获取帐号或获取 access_token 和 id_token 的东西。首先验证 access_token 并验证 id_token 的签名,然后解密令牌以获取基本用户信息。并使用该 id 从您的表中获取数据并使用该数据。

    编辑后:

    你可以在doc看到:

    paypal.configure({
      'openid_client_id': 'CLIENT_ID',
      'openid_client_secret': 'CLIENT_SECRET',
      'openid_redirect_uri': 'http://example.com' });
    
    // Authorize url
    paypal.openIdConnect.authorizeUrl({'scope': 'openid profile'});
    
    // Get tokeninfo with Authorize code
    paypal.openIdConnect.tokeninfo.create("Replace with authorize code", function(error, tokeninfo){
      console.log(tokeninfo);
    });
    
    // Get userinfo with Access code
    paypal.openIdConnect.userinfo.get("Replace with access_code", function(error, userinfo){
      console.log(userinfo);
    });
    

    当您获得授权码时,您可以使用它来调用paypal.openIdConnect.tokeninfo.create 并获取令牌。然后使用这些令牌调用paypal.openIdConnect.userinfo.get 以获取用户信息。现在,当您获得用户信息时,您将能够创建您想要创建的数据库行。

    您可以在 /callback 路由中添加以下两个调用。

    【讨论】:

    • 是的,我有点理解这种流动。我会更新这个问题来解释这个场景。
    • 编辑了答案
    • 我会从 paypal 获得用户信息,客户期望的 accountId 怎么样
    • 但是对于 accountId 什么要发送给客户端? client 这里是什么?
    • 客户端是一个 UI Angular 应用程序,我在服务上没有任何机制来保存当前登录用户的记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    • 2016-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    相关资源
    最近更新 更多