首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >OAuth2与认证

OAuth2与认证
EN

Security用户
提问于 2016-04-01 14:57:21
回答 2查看 5.5K关注 0票数 18

我看到很多关于OAuth2和身份验证的困惑,所以我创建了这个问题,希望能澄清一些困惑。那么,让我们谈谈以下几点:

  1. 认证和授权有什么区别?
  2. OAuth2意味着什么?
  3. 为什么OAuth2隐式流对于身份验证来说是不安全的,而对于授权仍然是安全的?(提示:访问令牌不绑定到特定的客户端)
  4. OAuth2隐式流和Oauth2身份验证代码流有什么区别,什么时候使用哪种?
  5. OAuth2身份验证代码流是否适用于身份验证?
  6. 您应该使用OpenID而不是OAuth2来进行身份验证吗?
  7. 为什么谷歌说他们的"OAuth2“框架可以用于身份验证和授权。

Google使用OAuth 2.0协议进行身份验证和授权。

https://developers.google.com/identity/protocols/OAuth2

OAuth2规范:https://www.rfc-editor.org/rfc/rfc6749

EN

回答 2

Security用户

回答已采纳

发布于 2016-04-01 19:10:46

代码语言:javascript
运行
复制
1.What is the difference between authentication and authorization?

身份验证是一个过程,通过这个过程,服务器会检查用户是否确实是它声称的用户。这通常是在用户提供用户名和密码时完成的,而当第一个用户创建其帐户时,服务器使用存储在数据库中的凭据(用户名、密码)检查这些凭据(用户名、密码)。授权是指一个实体授予另一个实体执行操作的权限。例如,在这种情况下,网站需要访问用户的数据,这些数据存储在不同的网站中并拥有。

代码语言:javascript
运行
复制
2.What is OAuth2 meant to do?

正式而言,OAuth2授权用户允许客户端网站C在通过认证服务器网站进行身份验证后访问他/她的资源服务器站点RS的数据。这似乎相当复杂,因此简化来说,一个常见的例子是,当用户使用他/她的facebook帐户在网站上签名时。在这种情况下,客户端网站和资源服务器网站是相同的(C=RS=the访问了网站),认证服务器是facebook (AS=facebook)。注意,这是创建的,这样C,RS就不会知道用户的密码,同时能够对他/她进行身份验证。

代码语言:javascript
运行
复制
3.Why is OAuth2 implicit flow insecure for authentication while still secure for authorization?

隐式流的特殊性在于将访问令牌赋予用户代理以转发到应用程序。因此,它完全基于重定向URI。因此,该流程不对应用程序的身份进行身份验证,因为不存在客户端秘密机密性(向运行在移动设备中的用户和应用程序公开的访问令牌)。

代码语言:javascript
运行
复制
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加密)的情况下,访问令牌就不能被中间人(路由器、代理等)访问。因此,前者适用于移动应用程序,后者则适用于服务器端应用程序。

代码语言:javascript
运行
复制
5.Does OAuth2 authentication code flow work for authentication?

是的,授权代码流还通过身份验证服务器对用户进行身份验证。

代码语言:javascript
运行
复制
6.Should you use OpenID instead of OAuth2 for authentication?

是。

OpenID用于身份验证。一个例子是,我们希望用户能够在多个网站上注册,只需一组凭据(签署-登录)。

正如前面所描述的,OAuth用于授权。请注意,可以稍微调整OAuth (如前面的示例中的C=RS),以便通过授权执行(伪)身份验证。但是,如果我们只需要身份验证,我们可以使用OpenID。

代码语言:javascript
运行
复制
7.Why is google saying that their "OAuth2" framework can be used for both authentication and authorization.

我想这个设计决定背后的真正原因只能由相应的谷歌工程师给出,但我可以假设,他们选择使用单一协议,而不是同时使用OpenID和OAuth,以简化事情。但是,请注意,通过OAuth进行身份验证是通过他/她所拥有的数据对某人进行身份验证。一个无聊的例子是,当我试图进入我的工作大楼时,我没有被问到我的资历,因为我的员工卡显然在我的脖子上。这就是通过OAuth进行身份验证的方式,非常简单。因此,您可以看到,这可以作出一些假设,但并不总是适用于每一种情况。这就是通常建议只在授权和使用OAuth时使用OpenID的原因,如果您还需要实现身份验证的话。

一个很好的链接,描述了OAuth用于参考文献的各种流

票数 15
EN

Security用户

发布于 2016-04-01 20:34:15

@RaptisDimos给出了一个很好的答案,但我想我会在第3点上花些功夫。

  1. 为什么OAuth2隐式流对于身份验证来说是不安全的,而对于授权仍然是安全的?

当您尝试使用它进行身份验证时,隐式流的问题是客户端直接接收访问令牌,并且访问令牌不绑定到任何特定的客户端。这意味着客户端不知道此令牌是用于他还是其他应用程序。

然后使用此令牌访问所有者数据。当您想要“验证”所有者时,通常会从他的数据中提取他的电子邮件,并在您的应用程序(客户端)中验证他的身份。但是,你不知道是谁把那个访问令牌传给你的客户的。是真正的所有者还是承载另一个服务的攻击者?

攻击

示例

  • Client_Good :使用google使用隐式流对其用户进行身份验证的好客户端
  • Client_Bad :使用google攻击Client_Good的恶意客户端

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规范一节中已经解释过了,换句话说,如果这有帮助的话。

票数 5
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/119225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档