我看到很多关于OAuth2和身份验证的困惑,所以我创建了这个问题,希望能澄清一些困惑。那么,让我们谈谈以下几点:
Google使用OAuth 2.0协议进行身份验证和授权。
发布于 2016-04-01 19:10:46
1.What is the difference between authentication and authorization?身份验证是一个过程,通过这个过程,服务器会检查用户是否确实是它声称的用户。这通常是在用户提供用户名和密码时完成的,而当第一个用户创建其帐户时,服务器使用存储在数据库中的凭据(用户名、密码)检查这些凭据(用户名、密码)。授权是指一个实体授予另一个实体执行操作的权限。例如,在这种情况下,网站需要访问用户的数据,这些数据存储在不同的网站中并拥有。
2.What is OAuth2 meant to do?正式而言,OAuth2授权用户允许客户端网站C在通过认证服务器网站进行身份验证后访问他/她的资源服务器站点RS的数据。这似乎相当复杂,因此简化来说,一个常见的例子是,当用户使用他/她的facebook帐户在网站上签名时。在这种情况下,客户端网站和资源服务器网站是相同的(C=RS=the访问了网站),认证服务器是facebook (AS=facebook)。注意,这是创建的,这样C,RS就不会知道用户的密码,同时能够对他/她进行身份验证。

3.Why is OAuth2 implicit flow insecure for authentication while still secure for authorization?隐式流的特殊性在于将访问令牌赋予用户代理以转发到应用程序。因此,它完全基于重定向URI。因此,该流程不对应用程序的身份进行身份验证,因为不存在客户端秘密机密性(向运行在移动设备中的用户和应用程序公开的访问令牌)。
4.What is the difference between OAuth2 implicit flow and Oauth2 authentication code flow and when to use which?如前所述,在隐式流中,访问令牌由用户代理转发给应用程序。另一方面,在授权代码流中,客户端web服务器首先获得授权代码(在资源所有者/用户授予访问权限之后),然后使用授权代码调用API传递(clientID、secretID)以获得访问令牌。这样,在HTTP连接(没有SSL加密)的情况下,访问令牌就不能被中间人(路由器、代理等)访问。因此,前者适用于移动应用程序,后者则适用于服务器端应用程序。
5.Does OAuth2 authentication code flow work for authentication?是的,授权代码流还通过身份验证服务器对用户进行身份验证。
6.Should you use OpenID instead of OAuth2 for authentication?是。
OpenID用于身份验证。一个例子是,我们希望用户能够在多个网站上注册,只需一组凭据(签署-登录)。
正如前面所描述的,OAuth用于授权。请注意,可以稍微调整OAuth (如前面的示例中的C=RS),以便通过授权执行(伪)身份验证。但是,如果我们只需要身份验证,我们可以使用OpenID。
7.Why is google saying that their "OAuth2" framework can be used for both authentication and authorization.我想这个设计决定背后的真正原因只能由相应的谷歌工程师给出,但我可以假设,他们选择使用单一协议,而不是同时使用OpenID和OAuth,以简化事情。但是,请注意,通过OAuth进行身份验证是通过他/她所拥有的数据对某人进行身份验证。一个无聊的例子是,当我试图进入我的工作大楼时,我没有被问到我的资历,因为我的员工卡显然在我的脖子上。这就是通过OAuth进行身份验证的方式,非常简单。因此,您可以看到,这可以作出一些假设,但并不总是适用于每一种情况。这就是通常建议只在授权和使用OAuth时使用OpenID的原因,如果您还需要实现身份验证的话。
一个很好的链接,描述了OAuth用于参考文献的各种流
发布于 2016-04-01 20:34:15
@RaptisDimos给出了一个很好的答案,但我想我会在第3点上花些功夫。
当您尝试使用它进行身份验证时,隐式流的问题是客户端直接接收访问令牌,并且访问令牌不绑定到任何特定的客户端。这意味着客户端不知道此令牌是用于他还是其他应用程序。
然后使用此令牌访问所有者数据。当您想要“验证”所有者时,通常会从他的数据中提取他的电子邮件,并在您的应用程序(客户端)中验证他的身份。但是,你不知道是谁把那个访问令牌传给你的客户的。是真正的所有者还是承载另一个服务的攻击者?
示例
Client_Bad可以是任何服务。例如,一个允许您在google驱动器中上传图片的web应用程序。为了完成这一任务,Client_Bad需要谷歌提供一个访问令牌。所以它会要求你给他一个。然后,您将能够使用它的服务上传您的图片。
您不知道的是,您为上传图片而给Client_Bad的访问令牌也是一个有效的访问令牌,可以与Client_Good一起使用来验证自己。现在,Client_Bad的所有者可以在Client_Good中模拟您。如果Client_Good是一个关键的服务,您可能会遇到严重的问题。
这是安全的,因为如果您授权Client_Bad代表您上传图片,那么不管他是直接这样做还是经过另一个服务来完成它。
例如,可能有第三个客户端,Client_Picture,它也只是上传图片到你的谷歌驱动器。当您要求Client_Bad上传您的内容时,Client_Bad可以将该任务委托给Client_Picture,您不会在意,因为它实现了相同的结果。
事实上,现在有很多第三方可以访问您的数据,但是您再次同意,Client_Bad可以在您提供该访问令牌时使用它做它想做的任何事情。就像把你的车钥匙递给邻居一样。你给了别人使用那辆车的权利,他可能会把它借给另一个邻居一段时间,然后还给你。问题是,你不知道,你“同意”,当你给了控制权。
注:有时我想知道是否没有人理解我的解释,或者我说错了什么.无论如何,这在10.16 of OAuth2规范一节中已经解释过了,换句话说,如果这有帮助的话。
https://security.stackexchange.com/questions/119225
复制相似问题