OAuth 2通常用于保护Web应用程序,在大多数情况下,OAuth 2被称为授权框架,其主要目的允许第三方网站或应用程序访问资源。在一个大的组织中,通常会使用多个应用程序,每个应用程序独立地管理凭据,这样会有许多缺点。如果将凭证管理的职能隔离在系统的一个组件中会更好,用户可以使用相同的凭据就可以登陆任何应用程序。这个组件称为授权服务器。
OAuth 2身份验证组件:
资源服务器:托管用户所拥有资源的应用程序。资源服务器会保存用户的所有数据。它只允许客户端在用户同意的情况下使用数据。客户端可以使用从授权服务器获得的证明来使用数据
用户(资源所有者):拥有由资源服务器暴露的资源的个体。用户需要访问和更改他所拥有数据,可以通过允许客户端使用它的数据。
客户端:以用户名义访问该用户所拥有的资源的应用程序。它可以是一个web或移动应用。用户使用这个应用程序访问或改变它拥有的数据。客户端使用客户端ID和客户端密钥来标识自己。注意这些凭据与用户凭据不同。客户端在发送请求时需要自己的凭据来标识自己。
授权服务器:授权客户端访问由资源服务器暴露的用户资源的应用程序。当授权服务器决定授权客户端以用户的名义访问资源时,它会发出一个令牌。客户端使用此令牌向资源服务器证明它已被收授权服务器授权。如果它有一个有效的令牌,则资源服务器将允许客户端访问它请求的资源
OAuth 2最常见的四种授权方式
授权码授权类型
1,客户端将用户重定向到需要进行身份验证的授权服务器端点。例如我们正在使用应用程序X,并且需要访问一个受保护的资源。为了访问该资源,应用程序X需要我们进行身份验证。它会打开一个授权服务器的页面,其中包含登陆表单,我们必须用凭据填写该表单。注意这里用户直接与授权服务器交互,不会向客户端应用程序发送凭据。
同时用户会调用授权端点,并在请求中使用一下详细信息。带有code值的response_type,它会告知授权服务器客户端需要一个授权码。client_id具有客户端ID的值,它会标识应用程序本身。redirect_uri,告知授权服务器在成功进行身份验证之后将用户定向到何处,有时授权服务器已经知道每个客户但的默认重定向uri,就可以不需要发送重定向uri。scope被授权的权限。state。定义一个跨站请求伪造令牌。
身份验证成功后,授权服务器将根据重定向uri回调客户端,并提供授权码和状态值。客户端会检查状态值是否与它在请求中发送的状态值相同。
2,使用授权码授权类型获取令牌
客户端将使用该授权码调用授权服务器以获取令牌。此请求包含code,步骤1接收到的授权码。这将证明用户经过了身份验证。client_id和client_secret,它们是客户端的凭据。redirect_uri,用户验证与步骤1的uri相同。authorization_code值的grant——type,标识所有用此流程的类型,确定执行哪个身份验证流程。最为响应,返回access_token。
3,使用授权码授权类型调用受保护资源
客户但要在授权请求头中使用访问令牌,可以调用受保护的资源。
为什莫不直接返回access_token。因为授权码,会证明用户经过了身份验证,并对客户端进行了授权。如果直接获取,无法确保收收到的令牌是正确的客户端。
优点:让用户可以允许客户端执行指定操作,而不需要与客户端共享凭据。
密码授权类型
也称为资源所有者凭据授权类型。使用此流程的应用程序会假定客户端收集用户凭据,并使用这些凭据进行身份验证,然后从授权服务器获得访问令牌。
1,使用密码授权类型时请求访问令牌。当请求访问令牌时,客户端请求发送信息:具有password值的grant_type。client_id和client_secret,客户端对其自身进行身份验证的凭据。scope,已授权权限。username和password 用户凭据。客户端在响应中收到回一个访问令牌。
2,使用令牌调用资源
使用令牌调用资源服务器上的端点。
密码授权类型,客户端与用户共享凭据。由于这个原因,这个类型只适用于资源所有者‘信任’客户端的情况。即使授权服务器和客户端都是由同一组织构建的,也应该首先考虑使用授权码授权类型,而将密码授权类型作为第二个选项。
客户端凭据授权类型
客户端凭据授权类型与密码授权类型类似。唯一的例外是对访问令牌的请求不需要任何用户凭据。
1,客户端向授权服务器发送请求。client_credentials值的grant_type,client_id和client_secret值,代表客户端凭据。scope,已授权的权限。
2,用令牌调用资源服务器上的端点。
刷新令牌获取新的访问令牌
当使用授权码或密码授权类型流程时,授权服务器将返回一个刷新令牌和一个访问令牌。一旦客户端有了一个刷新令牌,那么当访问令牌过期时,客户端应该发送一个请求。具有refresh_token值的grant_type,具有刷新令牌值的refresh_token,client_id和client_secret,scope。
为了响应此请求,授权服务器会发出一个新的访问令牌和一个新的刷新令牌。