相关文章

更多

最近更新

更多

OAuth 2.0 客户端如何获取授权

2019-04-23 00:04|来源: 网路

授权

当一个客户端应用想要访问拥有者托管在资源服务器的资源时,它必须先获得授权,本节将讲述客户端如何获取授权。

客户端标识,客户端密钥和重定向URI

在客户端应用能请求访问资源服务器的资源之前,客户端应用程序,必须先在资源服务器相关联的授权服务器中进行注册。

注册一个一次性的任务。一旦注册了,除非客户端注册被取消了,注册将持续有效。

注册后客户端应用将由授权服务器分配客户端标识和密钥。在授权服务器上,客户端标识和密钥是唯一标识客户端应用的。如果客户端应用注册了多个授权服务器(如Facebook, Twitter和Google等),每一个授权服务器将发出唯一的标识给该客户端应用。

无论什么时候客户端应用,想要访问同样资源服务器上的资源,它都需要通过发送客户端标识和密钥到授权服务器来验证自己。

在注册过程中,客户端应用也注册了一个重定向URI,当资源拥有者授权给客户端应用时,该重定向URI会被使用。当资源拥有者成功的通过授权服务器授权给客户端应用时,资源拥有者被重定向回客户端应用,再跳转到该重定向URI。

  • 授权批准

授权批准由资源服务器,及与其相关的授权服务器,给予客户端应用。

OAuth 2.0列举四种不同类型授权批准,每一种类型都有不同的安全特性。这些授权批准类型为:

  • 授权码

  • 契约

  • 资源拥有者密钥证书

  • 客户端证书

  • 每种授权批准在下文都会提到。

授权码

用授权码来授权批准原理如下:资源拥有者(用户)访问客户端应用。客户端应用告诉用户通过授权服务器(如Facebook, Google和Twitter等)来登录到客户端应用。

为了通过授权服务器登录,用户通过客户端应用被重定向到授权服务器。客户端应用发送它的客户端标识给授权服务器,那么授权服务器就知道是哪个应用尝试访问受保护的资源。当被重定向回客户端应用时,授权服务器发送给用户特定的重定向URI, 即客户端已经提前与授权服务器注册。随着重定向,授权服务器发送一个代表授权的授权码。

当在客户端应用的重定向URI被访问时,客户端应用直接连接授权服务器。客户端应用发送授权码,客户端标识及密钥,如果客户端应用能接受这些值,那么授权服务器返回一个访问令牌。

现在客户端应用就可以用该访问令牌请求资源服务器的资源了。该访问令牌可作为客户端授权和授权访问资源。

下面是当用授权码授权客户端应用时的授权过程:

通过授权码授权

契约

契约授权类似于授权码授权,除了用户完成授权后,访问令牌返回给客户端应用外。当用户代理被重定向到重定向URI时,访问令牌因此被返回。

当然这意味着访问令牌可以被用户代理访问,或者在契约授权过程中参与的原生应用。访问令牌在web服务器上不是安全存储的。

进一步说,客户端应用可以只发送它的客户端标识给授权服务器。如果客户端也发送它的密钥,那么客户端密钥将不得不保存在用户代理或原生应用里,那将使它很容易被破解。

契约授权大多数用在用户代理或原生应用中。用户代理或原生应用将收到来授权服务器的访问令牌。

下面是阐释契约授权的图:

契约授权

资源拥有者密钥证书

资源拥有者证书授权方法通过客户端应用访问资源拥有者证书来工作。比如,用户可以在客户端应用输入他的Twitter用户名及密钥(证书)。该客户端应用就可以用着用户名和密钥访问用户在Twitter的资源。

用资源拥有者密钥证书要求客户端应用很多信任。你不想在那些你怀疑会滥用证书的客户端应用中输入证书。

资源拥有者密钥证书通常被用在用户代理或原生应用中。

客户端证书

客户端证书授权对于客户端需要在资源服务器访问资源或调用函数的情形使用,与特定的资源拥有者无关(如用户)。比如,从Foursquare获取场地列表,这并没有必要通过某个Foursquare用户才能做。

相关问答

更多
  • 使用httpclient包吧, 很方便。 如果使用spring的项目, 可以尝试使用restTemplate
  • 要删除找不到的页面,请在'?'之前删除'/' https://www.linkedin.com/uas/oauth2/authorization?client_id=75gq3kju41jx44&redirect_uri=https%3A%2F%2Flocalhost%2FSocial%2Flinkedin%2Fsettings&scope=r_basicprofile%2Cw_share&response_type=code&state=1436579926-c05e44 For getting rid ...
  • 经过大量的研究,我发现client_credentials授权类型是为这种情况。 一旦你把这个术语打入谷歌,你可以找到非常有用的资源。 这是三脚OAuth 2.0的正常流程(我们希望用户登录): 假设我们的应用程序中有以下端点进行身份验证: /oauth/auth /oauth/token 通常(用于授权代码授权),我们将用户指向/oauth/auth?state=blah&client_id=myid&redirecturl=mysite.com/blah 然后验证后,用户被重定向到mysite.co ...
  • 我开始写你的问题的评论,但后来发现有太多的说法,所以这里是我对这个问题的看法。 是的,这是一个真正的可能性,有一些基于此的漏洞。 建议不要在你的应用程序中保持应用程序的秘密,甚至在分配的应用程序中也不应该使用这个标记。 现在你可能会问,但XYZ要求它工作。 在这种情况下,他们没有正确地执行规范,并且您应该不使用该服务(不太可能)或B尝试使用一些模糊的方法来保护令牌,从而难以找到或使用您的服务器作为代理。 例如,在Android的Facebook图书馆里有一些漏洞,它将漏洞记录到日志中,您可以在这里找到更多信 ...
  • 重定向URL的目标是防止恶意网站的开发人员欺骗OAuth服务器生成为您准备的令牌并将其提供给他们。 潜在的漏洞是: 请求https://oauth.server.com/login?app_id=2&redirect_uri=https://malicious.com 用户登录后,OAuth服务器会生成令牌并重定向到https://malicious.com?token=xxx 如果上述流程有效,恶意服务器将获得一个有效令牌,然后可以使用该令牌与您的应用程序进行交互。 相反,当您注册应用程序时,他们会立即要 ...
  • 是的,OAuth2.0规范指定您必须传递一些表单客户端凭据,以告知身份验证服务器您是合法的。 请查看https://tools.ietf.org/html/rfc6749#section-2.3 所以目的是, 只有有效的客户端才能与身份验证服务器通信 您可以根据机密或公共客户端类型自定义访问权限,并验证是否向其中一个有效客户端发出访问令牌。 当您的客户端凭据公开时,身份验证服务器可以轻松禁用指定oauth客户端,而不会阻止您的其他应用程序 Yes, OAuth2.0 spec specify you mus ...
  • 将'hd = example.com'添加到OAuth2请求中可能会产生预期的结果(非常类似于Google OAuth1流程 )。 但请注意,用户可以修改请求并删除或更改“hd”值。 因此,向hd参数添加特定值并不能保证使用特定的Google Apps域。 收到回复后,您仍应进行其他检查。 希望有所帮助。 Probably adding 'hd=example.com' to the OAuth2 requests will have the desired result (pretty much like ...
  • 似乎这是一个重复的问题。 “刷新令牌的想法是,如果访问令牌被泄露,因为它是短暂的,攻击者有一个有限的窗口可以滥用它。 刷新令牌(如果受到攻击)是无用的,因为除了刷新令牌之外,攻击者还需要客户端ID和机密才能获得访问令牌。“ 为什么OAuth v2同时具有访问权限和刷新令牌? Seems like this is a duplicate question. "The idea of refresh tokens is that if an access token is compromised, becaus ...
  • 使用表单参数而不是基本身份验证来验证客户端是使用allowFormAuthenticationForClients()方法启用的,如下面的代码示例所示。 class AuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter { @Override void configure(AuthorizationServerSecurityConfigurer security) { secu ...