我实施"使用PayPal登录"功能。应该相当简单,但遗憾的是PayPal缺少文档(只描述了一些基本的东西)。
我使用"使用PayPal登录"小部件。我向https://api.sandbox.paypal.com/v1/identity/openidconnect/tokenservice发出请求,并使用access_token,refresh_token和id_token获取JSON。我想获得唯一的用户标识符,所以我解码id_token,但我无法验证我的id_token的签名。 Id_token标头包含{"alg": "HS256", "typ": "JWT"}
。
我应该使用什么秘密?尝试了我的应用程序的秘密(我用来访问tokenservice),但它没有用(使用https://jwt.io/调试器)。
答案 0 :(得分:1)
PayPal不符合OpenID连接。 This答案解释了原因。
PayPal公开配置端点 - https://www.paypalobjects.com/.well-known/openid-configuration。它仅支持HS256
,不支持或提及RS256
。这可能是由于ID令牌的专有验证。例如,用作承载令牌的id令牌。
替代解决方案是按document所述调用userinfo
端点。可以使用access token
调用此端点,文档说它将返回user_id
user_id - 发卡行最终用户的标识符。
虽然似乎在userinfo中找到的user_id
与可从id_token中提取的sub
不同。
如果签名算法是RS256
,如何找到公钥。ID令牌是JWT。如您所知,它包含一个充当MAC的JWS签名。
此签名是使用私钥签名的。 id令牌的接收者可以使用公钥来验证令牌。要查找公钥,openid conenct指定发现文档。您可以从specification
了解更多相关信息在发现文档中,您将获得一个特殊端点来推断配置.well-known/openid-configuration
。其中一个必须具有配置响应的元数据是jwk_url
<强> jwks_uri 强>
必需的。 OP的JSON Web密钥集[JWK]文档的URL。这个 包含RP用于验证签名的签名密钥 OP。 JWK Set MAY还包含服务器的加密密钥, RP使用它来加密对服务器的请求。当两个 签名和加密密钥可用,一个用途(密钥使用) 参考JWK设置为的所有键的参数值都是必需的 表示每个密钥的预期用途。虽然有些算法允许 同样用于签名和加密的密钥,这样做 不推荐,因为它不太安全。 JWK x5c参数可以是 用于提供所提供密钥的X.509表示。使用时, 裸键值必须仍然存在并且必须与中的那些相匹配 证书。