我认为您对 oauth 授权的工作方式有些误解。基本上,如果您想获取任何数据,您需要在使用回调并验证系统中的用户之后执行此操作。
您是否见过 Google/github 等 openid 身份验证提供程序返回一些与调用方系统数据相对应的数据?这是不可能的。
您可能将此与 webhook 混淆了,在 webhook 中,调用者系统在内部调用带有一些数据的 webhook 并捕获它。常用于支付交易。
但身份验证略有不同。对于身份验证,有 3 个系统。
-
实际的身份验证提供者(Paypal/google/github)等。
-
身份提供者,它基本上获取个人资料数据等,除了企业系统之外,这两个系统完全一样。
- 调用者系统,在这种情况下是您的 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 路由中添加以下两个调用。