OAuth2仅在存在第三方授权时使用吗?

19

我现在正在阅读关于oauth2的内容,并试图理解它的目的。根据我所读到的所有资源,似乎只有当一个web应用(比如游戏应用)拥有一些用户并且应用程序想要访问用户的Facebook或Google数据时(例如姓名或电子邮件等),才会使用oauth2。这部分对我来说很清楚。但是,以下内容对我仍然不清楚:

  1. 例如:如果我有一个web应用,我希望我的web应用的用户可以使用他们的登录名和密码登录web应用(就像您在gmail中所做的那样),而不使用任何第三方。Oauth2是否也提供这种类型的授权?
  2. 我看到过一些web应用,他们允许用户使用ID和密码注册,然后将密码进行加盐处理并将其存储在数据库中。因此,当用户稍后登录时,他们会对用户输入的密码进行加盐处理,并将这个加盐值与数据库中的加盐值(在注册期间创建)进行比较。如果相等,则用户已登录。这对我来说完全不像oauth。如果这不是oauth,那么这是什么标准?还有其他类似于“直接登录”的标准吗?

  3. 假设我想允许用户注册并登录我的网站,但是允许他们通过第三方(如Facebook或Google)登录。这仅用于授权目的,并假设我的应用程序没有计划在其Facebook上发布或请求其Facebook数据,除了我可能想使用他们的Facebook电子邮件作为我的Web应用程序的用户ID之外。Oauth2是否提供此类型的授权?

抱歉我提出了这些幼稚的问题,因为我最近才开始阅读有关oauth的内容。

2个回答

6
  1. 对于没有第三方登录/注册的情况,正如Kevin所指出的那样,每个编程/网络框架通常都带有一个流行的库,一旦使用它,它将为您生成所有的登录/注册页面、数据库表、流程等。然后,当您需要确定用户是谁时,在后端代码中调用库提供的方法返回当前已登录的用户即可。

  2. 使用盐值密码方案OAuth 2.0没有任何关系,正如你所指出的那样。它是一种广泛使用的本地认证方案,因为它有许多好处,但我只想在这里强调两点:

a. 当从用户通过互联网传输到服务器进行身份验证时,密码不会以明文形式发送,而是以哈希格式发送。因此,即使被窃听,密码也不会被泄露。

b. 由于每个密码都被加盐,即使两个相同的密码也不会有相同的哈希值,因为它们各自具有不同的盐。因此,即使密码哈希值被窃听,它也不能在用户使用相同密码的另一个服务中被重复使用,因为其他服务期望使用不同盐生成的密码哈希值。
  1. OAuth2 的全部内容都是关于授权的(请求用户允许代表她在另一个网络服务上执行某些操作,例如请求用户允许访问她在 Facebook 上注册的电子邮件地址)。将其用于身份验证可能是不安全的(对于 OAuth2 隐式流程)。为什么?OAuth2 的最终结果是与权限相关联的访问密钥,例如“访问电子邮件地址的权限”。当您使用 OAuth2 结果(访问密钥)进行身份验证时,这意味着您假设“访问电子邮件地址的权限”意味着用户已经成功地通过了 Facebook 的身份验证,这似乎很好。但是,请想象一下,如果另一个站点也像您一样使用 OAuth2 进行身份验证;如果它收到一个带有“访问电子邮件地址的权限”的访问密钥,它将假定您已经通过 Facebook 进行了身份验证,因此它将授予您访问属于该电子邮件地址的帐户的权限。您实际上可以使用从用户那里获得的访问密钥,在其他站点上以她的身份登录,反之亦然。

使用OAuth2进行身份验证时,需要与OpenID Connect(OIDC)一起使用,因为OAuth2-OIDC的最终结果包含aud(受众)字段标识访问密钥所属的用户(https://openid.net/specs/openid-connect-core-1_0.html#IDToken),从而防止访问密钥在未经授权的情况下被重复使用。这里有一个带有易于理解的图表的完整说明:https://www.slideshare.net/KhorSoonHin/the-many-flavors-of-oauth/36?src=clipshare

另一种非常简单但可能引起安全注意的方法是使用资源所有者密码凭据来使用OAuth2进行登录,其中您的网站充当用户和OAuth2提供商(Facebook)之间的中间人。

  1. 显示“使用Facebook登录”按钮
  2. 当用户点击该按钮时,提示用户输入Facebook用户名/密码
  3. 使用用户名/密码登录到Facebook以确认身份验证并获取访问令牌。

如果您没有时间深入了解OAuth2,也许这个OAuth2流程的并排比较可以帮助您。

Comparing flow diagrams for all four OAuth2 flow/grant types

这是由https://blog.oauth.io/introduction-oauth2-flow-diagrams/提供的


3
  1. 您可以使用OAuth进行本地登录,但并不一定需要。这取决于可用的库,如果您预计将服务提供给第三方,则可能更容易,并且可能是有意义的。然而,对于许多网站来说,使用OAuth进行本地登录可能过度。

  2. 当不同参与者需要使用共同语言以便进行互操作时,标准就最有用了。对于本地登录,您不需要标准,因为您没有与任何第三方进行交互。许多Web框架包括自己的变体。

  3. 我认为您正在询问在您实际上不需要任何授权(访问第三方资源的权限)时,OAuth是否适用于身份验证(建立身份)。它确实可以这样使用,但很多人会警告它不适用于此,因为它并非为此而设计,在该上下文中存在一些安全弱点。请参见,例如使用OAuth进行身份验证的常见陷阱


Kevin,谢谢。您知道有哪些著名的现有框架/库可用于本地登录吗?还是说像这样的东西都不存在,每个网站都必须实现自己的呢?我最近正在阅读JWT(JSON Web Token),仍在试图弄清楚它是否适用于本地登录。但JWT更像是一个标准而不是一个框架。 - Simo
@Simo:大多数 Web 框架都包含某种形式的身份验证实现,而且许多框架还支持第三方软件包添加其他功能。以我最熟悉的 Django(一种 Python Web 框架)为例,它有自己的身份验证系统,并且还有第三方项目添加了 OAuth社交登录集成等功能。 - Kevin Christopher Henry

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接