我的服务器在标头中获得承载令牌,如下所示:Authorization: Bearer <token>
。现在,我需要验证该令牌,为了实现这一点,我需要谁发行令牌。例如,Google令牌需要我使用Google API对其进行验证,而Facebook发行令牌需要我使用Facebook API对其进行验证。
那么我怎么知道令牌的来源呢?也许我需要在标头中指定其来源的另一个字段?
答案 0 :(得分:2)
由于您使用的是多个授权提供程序,所以我想您不会使用profile
之外的其他范围(以获取用户的身份)。因此,我认为您可以使用自己的OAuth2服务器,该服务器支持使用外部提供程序(Google,Facebook)进行身份验证。然后,您的应用程序将仅处理由OAuth2服务器发出的访问令牌,该令牌还将保留有关用户身份的信息。此解决方案的另一个好处是,您可以为没有社交网络帐户的用户提供支持-他们将在OAuth2服务器上创建一个新帐户。
另一种解决方案可能不太优雅,但更易于实现。创建一条规则,即在使用访问令牌之前,客户端必须在新端点上使用有关令牌发行者(Google,Facebook ...)的信息注册该令牌。然后,您可以保留有关谁发行了哪个令牌的信息。此时,在验证访问令牌之后,您还可以考虑将令牌替换为会话cookie,以便稍后用于访问API而不是访问令牌。此解决方案是有状态的,因此很难扩展,但是使用cookie可能会使客户端更易于实现(不需要令牌刷新)。
如您所写,您还可能需要有关谁发行令牌的额外信息。您可以为其使用自定义HTTP标头或令牌前缀。它很容易实现,并且不会在您的后端引入状态。
也许还有更多解决方案。您可以根据自己的需要选择一种。
答案 1 :(得分:0)
如果您将Authorization: Bearer <token>
定义为RFC6750所定义的Bearer Token用法,那么可以考虑的选项就很少。
无论如何,令牌(在标头中发送的令牌)是JSON Web令牌(JWT),则您的API可以验证JWT中的签发者参数以识别签发者。要使用此方法,请求发送客户端需要获取JWT访问令牌。向其他提供商咨询此功能。
如果第一个选项失败,那么您将必须使用自定义标头来传达发行者详细信息。根据定义,访问令牌(使用JWT时除外)是不透明的,因此您的API无法通过查看来派生发行者。因此,您的客户将需要传达发行人的详细信息。
第三种选择是先进行客户注册,然后再允许他们使用您的API。注册后,您可以向他们颁发一个标识符,您可以将其映射到访问令牌颁发者。当客户提出请求时,您可以要求他们通过例如标头传达客户信息。这样,您就可以将API使用能力限制为任何可以获取访问令牌的人。