2017-08-02 69 views
2

我正在实施“使用PayPal登录”功能。应该相当简单,但不幸的是PayPal缺乏文档(只描述了一些基本的东西)。PayPal id_token验证

我使用“登录贝宝”插件获得authorization_code。我向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"}

我应该使用什么秘密呢?尝试了我的应用程序的秘密(我使用访问令牌服务的秘密),但它不起作用(使用https://jwt.io/调试器)。

+0

他们是否提供发现文档? [http://openid.net/specs/openid-connect-discovery-1_0.html] –

+1

@KcDoD也许他们有,但它似乎没有被记录:) – Fedor

回答

1

PayPal是不是OpenID的连接标准。 This答案解释了原因。

贝宝公开配置端点 - https://www.paypalobjects.com/.well-known/openid-configuration。它只支持HS256,不支持或不提及RS256。这可能是由于ID令牌的专有验证。例如,用作不记名令牌的id令牌。

替代的解决方案是通过document描述来调用userinfo端点。此端点可以使用access token被调用,文件说,它会返回user_id

USER_ID - 标识在发行人的最终用户。

虽然它似乎在用户信息中发现user_idsub,可以从id_token提取不同。

如何找到公共密钥,如果签名算法是RS256

ID令牌是智威汤逊。正如您发现的那样,它包含一个充当MAC的JWS签名。

这个签名是利用私钥签名。 id令牌的接收者可以使用公钥验证令牌。为了找到公钥,openid conenct指定一个发现文档。您可以从specification

中了解更多信息在发现文档中,您会得到一个特殊端点来推断配置.well-known/openid-configuration。和配置响应的必须的元数据中的一个是jwk_url

jwks_uri

REQUIRED。 OP的JSON Web密钥集[JWK]文档的URL。此 包含RP用来验证来自 OP的签名的签名密钥。 JWK集合还可以包含服务器的加密密钥 ,这些密钥由RP用于加密对服务器的请求。当两个 签名和加密密钥提供了一个用(键使用) 参数值需要在参考JWK设为 所有键指示每个按键的设计用途。虽然有些算法允许使用同一个密钥同时用于签名和加密,但这样做的结果不是 ,因为它不太安全。 JWK x5c参数可以是 ,用于提供所提供的密钥的X.509表示。在使用时, 裸露键值必须仍然存在,并且必须与 证书中的值匹配。

+0

谢谢你的帮助。您是不是描述了RSA签名的情况?矿山有HS256(这在JOSE中有描述)。所以它应该是一个简单的情况,客户端和服务器都使用一个共享密钥进行签名。不是吗? – Fedor

+0

@Fedor啊,是的。我没有把注意力放在jose头文件中的算法上。那么我来过这个开发讨论https://groups.google.com/forum/#!topic/mod_auth_openidc/fPc_C8rb9ns –

+0

好吧,这里有一个很好的解释 - https://stackoverflow.com/questions/31143353/using-login -with-贝宝和使用,OpenID的用-AWS-cognito。我希望这应该清除疑惑:) –