Authentication 谁发行了无记名代币

Authentication 谁发行了无记名代币,authentication,oauth-2.0,jwt,Authentication,Oauth 2.0,Jwt,我的服务器在头中获得一个承载令牌,如下所示:Authorization:bearer。现在我需要验证该令牌,为了实现这一点,我需要谁发布令牌。例如,Google令牌需要我使用Google API对其进行验证,而Facebook发布的令牌需要我使用Facebook API对其进行验证 那么我怎么才能知道代币的来源呢?也许我需要在标题中指定其来源的另一个字段?由于您使用多个授权提供程序,我猜您不使用除profile之外的作用域(以获取用户身份)。因此,我认为您可以使用自己的OAuth2服务器,该服务

我的服务器在头中获得一个承载令牌,如下所示:
Authorization:bearer
。现在我需要验证该令牌,为了实现这一点,我需要谁发布令牌。例如,Google令牌需要我使用Google API对其进行验证,而Facebook发布的令牌需要我使用Facebook API对其进行验证


那么我怎么才能知道代币的来源呢?也许我需要在标题中指定其来源的另一个字段?

由于您使用多个授权提供程序,我猜您不使用除
profile
之外的作用域(以获取用户身份)。因此,我认为您可以使用自己的OAuth2服务器,该服务器支持使用外部提供商(Google、Facebook)进行身份验证。然后,您的应用程序将只处理OAuth2服务器颁发的访问令牌,它还将保留有关用户身份的信息。此解决方案还有一个附加好处,即您可以支持没有社交网络帐户的用户—他们将在OAuth2服务器上创建一个新帐户

另一种解决方案可能不那么优雅,但更容易实现。创建一条规则,即在使用访问令牌之前,客户端必须在某个新端点注册令牌,并提供令牌颁发者的信息(谷歌、Facebook…)。然后您可以保留有关谁发行了哪个令牌的信息。在这一点上,在验证访问令牌之后,您还可以考虑为会话cookie替换令牌,该会话cookie稍后将用于访问API而不是访问令牌。这个解决方案是有状态的,这使得它更难扩展,但是使用cookie可能会使客户端更容易实现(不需要令牌刷新)

正如您所写的,您还可以要求提供有关谁发行代币的额外信息。您可以使用自定义HTTP头或令牌前缀。它易于实现,并且不会向后端引入状态


也许还有更多的解决办法。你可以选择一个可以满足你的需要的。

如果你是“代码>授权:承载者<代码>是由定义的承载令牌使用,那么就没有什么可考虑的选项了。 如果通过任何方式,令牌(在头中发送的令牌)是JSON Web令牌(JWT),那么您的API可以在JWT中验证issuer参数以识别颁发者。要使用这种方法,请求发送客户端需要获得JWT访问令牌。请向不同的提供商咨询此功能

如果第一个选项失败,则必须使用自定义标题来传达发卡机构的详细信息。根据定义访问令牌(使用JWT时除外)是不透明的,所以您的API无法通过查看它来派生issuer。因此,您的客户需要传达发卡机构的详细信息


第三种选择是在允许客户端使用您的API之前进行客户端注册。注册后,您可以向他们颁发一个标识符,您可以映射访问令牌颁发者。当客户机发出请求时,您可以要求他们通过例如标头来传达客户机信息。通过这种方式,您可以限制任何可以获得访问令牌的人使用API的能力。

是的,在中期内,我将使用自己的OAuth2服务器(或openId服务器),我一定会实现您提出的解决方案。就目前而言,我认为页眉法是最好的。