Oauth2协议详解

本文来说下什么是Oauth2


什么是OAuth2

OAuth2是一个非常常用的协议,也非常的方便,主要目的就是使第三方服务器可以获得授权范围内的用户信息

OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAuth2.0是OAuth协议的延续版本,但不兼容OAuth 1.0,即完全废止了OAuth1.0。

在现代的网站中,我们经常会遇到使用OAuth授权的情况,比如有一个比较小众的网站,需要用户登录,但是直接让用户注册就显得非常麻烦,用户可能因为这个原因而流失,那么该网站可以使用OAuth授权,借助于github或者其他的第三方网站的认证授权,来获取相关的用户信息,从而避免了用户注册的步骤。

当然,很可能在第三方网站上授权获得用户信息之后,还需要在本网站填写一些必要的信息进行绑定,比如手机号,用户名等等。但是这比单纯的注册要方便太多了,也容易让用户接受。

今天,我们将要讲解一下OAuth 2.0授权框架的构成,希望大家能够喜欢。

在这里插入图片描述


应用场景

第三方应用授权登录:在APP或者网页接入一些第三方应用时,经常会需要用户登录另一个合作平台,比如QQ,微博,微信的授权登录。

在这里插入图片描述

原生app授权:app登录请求后台接口,为了安全认证,所有请求都带token信息,如果登录验证、请求后台数据。

前后端分离单页面应用(spa):前后端分离框架,前端请求后台数据,需要进行oauth2安全认证,比如使用vue、react后者h5开发的app。


名词说明

名词说明

  • Third-party application:第三方应用程序,本文中又称"客户端"(client),比如打开知乎,使用第三方登录,选择qq登录,这时候知乎就是客户端。
  • HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上例的qq。
  • Resource Owner:资源所有者,本文中又称"用户"(user),即登录用户。
  • User Agent:用户代理,本文中就是指浏览器。
  • Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。
  • Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

运行流程

OAuth 2.0的运行流程如下图,摘自RFC 6749

在这里插入图片描述
在这里插入图片描述


授权模式

授权码模式

授权码模式(authorization code)是功能最完整、流程最严密的授权模式。

(1)用户访问客户端,后者将前者导向认证服务器,假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。

(2)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌:GET /oauth/token?response_type=code&client_id=test&redirect_uri=重定向页面链接。请求成功返回code授权码,一般有效时间是10分钟。

(3)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。POST /oauth/token?response_type=authorization_code&code=SplxlOBeZQQYbYS6WxSbIA&redirect_uri=重定向页面链接。


简化模式

简化模式(implicit grant type)不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

在这里插入图片描述

流程步骤:

  • 客户端将用户导向认证服务器。
  • 用户决定是否给于客户端授权。
  • 假设用户给予授权,认证服务器将用户导向客户端指定的"重定向URI",并在URI的Hash部分包含了访问令牌。
  • 浏览器向资源服务器发出请求,其中不包括上一步收到的Hash值。
  • 资源服务器返回一个网页,其中包含的代码可以获取Hash值中的令牌。
  • 浏览器执行上一步获得的脚本,提取出令牌。
  • 浏览器将令牌发给客户端。

请求URL:

GET /authorize?response_type=token&client_id=s6BhdRkqt3&state=xyz
     &redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb HTTP/1.1
    Host: server.example.com

用户名密码模式

密码模式(Resource Owner Password Credentials Grant)中,用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。这通常用在用户对客户端高度信任的情况下。一般不支持refresh token。

在这里插入图片描述

步骤说明:

  • 用户向客户端提供用户名和密码。
  • 客户端将用户名和密码发给认证服务器,向后者请求令牌。
  • 认证服务器确认无误后,向客户端提供访问令牌。
   POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded
 grant_type=password&username=johndoe&password=A3ddj3w

客户端模式(Client Credentials Grant)

指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。严格地说,客户端模式并不属于OAuth框架所要解决的问题。在这种模式中,用户直接向客户端注册,客户端以自己的名义要求"服务提供商"提供服务,其实不存在授权问题。

在这里插入图片描述

它的步骤如下:

  • 客户端向认证服务器进行身份认证,并要求一个访问令牌。
  • 认证服务器确认无误后,向客户端提供访问令牌。

A步骤中,客户端发出的HTTP请求,包含以下参数:

  • granttype:表示授权类型,此处的值固定为"clientcredentials",必选项。
  • scope:表示权限范围,可选项。
     POST /token HTTP/1.1
     Host: server.example.com
     Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
     Content-Type: application/x-www-form-urlencoded

     grant_type=client_credentials

本文小结

本文详细介绍了Oauth2协议相关的知识与内容。

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: OAuth 2.0 是一个开放的授权框架,它允许用户授权第三方应用访问他们存储在另一个服务提供者上的信息,而无需将用户名和密码提供给第三方应用或分享他们的账户与第三方应用。 要在 Java 中实现 OAuth 2.0,您需要: 1. 选择一个 OAuth 2.0 客户端库,例如 ScribeJava、Apache Oltu 或 Spring Security OAuth。 2. 注册您的应用程序与服务提供者。服务提供者将向您提供客户端 ID 和客户端密码,这些信息将用于身份验证。 3. 在您的应用程序中创建 OAuth2ClientContext 和 OAuth2ProtectedResourceDetails 对象,并使用客户端 ID 和客户端密码初始化它们。 4. 使用 OAuth2ClientContext 和 OAuth2ProtectedResourceDetails 对象构建 OAuth2RestTemplate 对象。 5. 使用 OAuth2RestTemplate 对象发出调用以访问受保护的资源。 以下是使用 ScribeJava 库的示例代码: ``` import com.github.scribejava.core.builder.ServiceBuilder; import com.github.scribejava.core.model.OAuth2AccessToken; import com.github.scribejava.core.model.OAuthRequest; import com.github.scribejava.core.model.Response; import com.github.scribejava.core.model.Verb; import com.github.scribejava.core.oauth.OAuth20Service; public class OAuth2Example { private static final String PROTECTED_RESOURCE_URL = "https://api.example.com/resource"; private static final String CLIENT_ID = "your_client_id"; private static final String CLIENT_SECRET = "your_client_secret"; public static void main(String[] args) { final OAuth ### 回答2: OAuth2是一种开放标准的授权协议,允许第三方应用程序以受限的方式获取用户在某个平台上的权限。在Java中,我们可以使用一些库和框架来实现OAuth2协议。 首先,我们可以使用Spring Security OAuth2来实现OAuth2协议。Spring Security OAuth2提供了一系列的类和注解,帮助我们快速实现OAuth2的认证和授权流程。 我们首先需要配置OAuth2的客户端信息,包括client_id、client_secret和redirect_uri等。我们可以使用Spring Security OAuth2提供的`@EnableOAuth2Client`注解来启用OAuth2客户端。 接下来,我们需要实现OAuth2的授权码模式(authorization code grant)或者密码模式(password grant)。授权码模式需要用户手动授权,并将授权码发送给第三方应用程序。而密码模式则需要用户提供自己的用户名和密码。 对于授权码模式,我们可以使用Spring Security OAuth2提供的`AuthorizationCodeResourceDetails`类和`AccessGrant`类来处理获取授权码和访问令牌。我们可以使用`AuthorizationCodeResourceDetails`类设置授权码和令牌的相关信息,然后使用`AccessGrant`类来获取授权码和令牌。 对于密码模式,我们可以直接发送用户的用户名和密码,并使用Spring Security OAuth2提供的`UsernamePasswordResourceDetails`类和`AccessGrant`类来获取访问令牌。 在我们成功获取访问令牌之后,我们可以使用该令牌来访问受保护的资源。我们可以使用Spring Security OAuth2提供的`RestTemplate`类来发送HTTP请求并附带访问令牌。 综上所述,我们可以使用Spring Security OAuth2来实现OAuth2协议。通过使用Spring Security OAuth2提供的注解、类和方法,我们可以在Java中快速实现OAuth2的认证和授权流程。 ### 回答3: OAuth2是一种开放标准的授权协议,用于授权第三方应用程序访问用户资源。Java是一种强大的编程语言,可以用于实现OAuth2协议。下面是一个简单的示例,展示了如何使用Java实现OAuth2协议: 首先,需要使用Java开发工具包(JDK)进行开发。在Java中,可以使用Spring Security框架来实现OAuth2协议。Spring Security提供了一套强大的安全框架,可以轻松地实现身份验证和授权功能。 其次,需要在Java中创建一个授权服务器。授权服务器负责验证用户的身份和颁发访问令牌。可以使用Spring Security OAuth2库来实现授权服务器。该库提供了一组注解和类,用于配置和管理OAuth2授权服务器。 然后,需要创建一个资源服务器。资源服务器负责处理受保护资源的请求,并验证OAuth2访问令牌的有效性。可以使用Spring Security OAuth2库来实现资源服务器。通过配置和注解,可以指定哪些资源需要被保护,并定义访问这些资源所需的权限。 最后,需要创建第三方应用程序。第三方应用程序将使用OAuth2协议来请求访问用户资源。可以使用Java的HTTP客户端库(如Apache HttpClient)来发送OAuth2授权请求,并处理授权服务器返回的访问令牌。 通过以上步骤,就可以使用Java实现OAuth2协议。Java提供了丰富的库和框架,使得实现OAuth2变得简单和灵活。使用Java进行开发,可以轻松地构建安全可靠的授权系统,保护用户的隐私和敏感数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值