我有一个API服务器(资源服务器)和多个应用程序,Web (SPA)和桌面客户端,也许还会有更多的应用程序。除了我的API服务器的http基本身份验证之外,我还想使用openid-connect。它应该是可配置的openid提供者要使用的。我自己的facebook谷歌..。我只想做认证,我不需要他们的API。我只需要一些个人资料,如电子邮件或名字。
假设我已经将谷歌配置为我的IdP,并且我目前正在使用Web (SPA)。我需要登录,没有问题,根据https://developers.google.com/identity/protocols/OpenIDConnect,我将用户重定向到谷歌,获得我的授权代码,Web (SPA)从谷歌获得一个id_token和access_token。
到目前为止没有问题,但是现在SPA必须与我的API一起工作,并且API需要对来自客户机(WebGui SPA)的每个请求(因为它是一个无状态rest )进行身份验证,并且需要知道哪个用户实际这样做了。
A
所以,谷歌的access_token是用来访问google的,对吗?但是,我也可以通过每个请求将这个access_token传递给我的api服务器,api服务器调用token=xxx来验证access_token并获取帐户名(邮件)。但这听起来不对,对吧?
B
我也有和id_token,我可以验证,而不是每次调用谷歌服务器。因此,我是否也可以将id_token作为承载器传递给我的api服务器,而api服务器可以验证id_token?但是根据openid规范,access_token实际上是传递给api服务器的id_token,id_token必须保持在客户机上。但是id_token对我来说是完全无用的,API服务器需要知道用户是谁,客户端(Web )并不在乎。
C
或者因为它是我自己的API,我的API实际上是否需要自己实现整个oauth2系统,只是不需要身份验证,而是创建access_token等等。因此,我将有一个/ API /记号,可以将id_token从google传递给它,API验证id_token并为id_token (SPA)创建一个access_token。这个新的access_token可以作为每个api请求的承载者传递。根据规范,这听起来是最好的解决方案,但我真的需要自己在API中实现oauth2吗?听起来很重,因为A和B也可以实现。
我的rest-api需要对每个请求进行身份验证,所以A、B、C是正确的方法吗?请不要告诉我这是基于意见的,不是的。使用oauth2/openid-connect进行身份验证的正确方法是什么?
发布于 2017-07-22 04:55:42
您可以使用上面提到的所有三种方法,但确实需要考虑一些因素。我将就现有的规格说明它们。
场景-两个系统S1,S2
您需要的-信任并使用S1发出的“令牌”访问S2
拟议溶质A、B和C的解释
A -验证S1为每个呼叫发出的令牌
这可以使用RFC7662 - OAuth 2.0令牌内省端点来完成。这个验证对规范是有效的,所以您可以使用令牌验证端点。
这种方法的优点是,如果一个令牌被撤销,效果是瞬时的。下一个API调用将失败。但事实上,这是对表演的暗示。你需要一个额外的验证服务电话。
请注意,您不需要从此验证响应中获取帐户名称。它可以从ID令牌中提取,并可用于验证以获得额外的保护。
B - S1为每个呼叫发行的信任令牌
现在,这种方法是从RFC6750扩展而来的-- OAuth 2.0授权框架:承载令牌使用。您确实可以使用ID对最终用户进行身份验证和授权。这个链接包含了关于ID令牌作为承载令牌的使用的很好的解释。
您确实可以使用MAC甚至加密来验证令牌的有效性。但是要注意使用短暂的令牌,并且始终使用TLS。注意提神代币!因为根据openID连接规范,ID令牌不是刷新令牌请求的强制项。
C - -联邦的包装器
为此,您可以编写自己的解决方案或使用现有解决方案(例如:- WSO2 身份服务器)。此身份服务器将配置为在应用程序上选择身份提供程序(客户端,如桌面应用程序或web应用程序)。Identity服务器将执行必要的重定向,并向您提供所需的令牌。但是实际上,您需要使用内省端点来验证令牌的有效性。
如果您比此解决方案领先一步,则可以尝试实现代码交换机制。您可以将令牌从外部传递到某个系统内部发出的令牌(例如:- Google访问令牌到您的内部访问令牌)。这种方法的优点是您可以控制验证。另外,由于随后的令牌验证是在内部完成的,因此应该有性能改进。
希望这能解释你的疑虑。
https://stackoverflow.com/questions/45242249
复制相似问题