oAuth2.0简单使用与Demo

一、关于oAuth2.0
关于什么是oAuth2.0,以及相关的名词网上有很多解释,再次不做赘述,本文将直接结合一个实例,来描述oAuth2.0的原理流程。

二、前提说明
本文的案例的环境为SpringBoot(其实这个并不重要),以使用码云的账号登录为例子,所以需要先注册一个码云的账号。

三、Demo
首先创建一个WEB项目,并且写一个最简单的登录页面。
在这里插入图片描述
这是一个简单到不能在简单的登陆页面了,用户别无选择,只能使用码云的账号登陆我们的网站或系统。
码云登录
整个页面的代码只有超链接,注意着链接的访问地址后面带有三个参数,第一个参数是我们当前的应用在码云上注册的时候获取的Id,第二个参数是一个回调地址,第三个参数是一种固定写法,表示我们使用授权码的方式获取令牌。
关注点(1):当我们自己的网站应用需要提供使用第三方账号登陆的功能的时候,比如使用QQ,微信,微博,码云等等,首先需要做的是在对应的网站上去注册我们的应用。
在这里插入图片描述
比如上面,是我在码云上注册的当前Demo,在注册的时候,我们只需要填写我们应用的网址,回调地址(这个后面说),应用描述以及希望获取那些用户信息,然后提交申请之后,码云会给我们ClientID和ClientSecret这两个字符串,其中ClientID就是我们的应用在码云认证服务上的唯一标识,也是我们在登陆页面超链接后面附带的client_id的值。

关注点(2):当用户在我们的网站登录页点击“码云登录”后,相当于网站将用户的浏览器重定向到码云的授权许可页面(这也是网上很多原理图中描述的第一次重定向)
在这里插入图片描述
上面这个就是重定向之后的码云的授权页面,(其他的诸如QQ,微信等等,差不多都是类似的页面)。这个页面里用户可以选择同意授权。
用户选择同意授权后是不是就能获取到 用户在码云上注册的用户信息呢?肯定不是!接下来将会多个步骤,而这些步骤对于用户来说是无法感知的,所有的交互度都发生在我们自己网站的后台。
1.首先,码云确认用户同意授权后,会发放一个授权码给我们的网站,那码云是怎么发给我们的网站呢?它实际上使用的就是回调地址。这个回调地址我们在码云上注册应用的时候就会让我们填写,我们在首页的“码云登录”链接也需要加入这个参数,这个回调地址就是告诉码云(认证服务器),如果用户同意授权了,那么你应该让浏览器跳转到哪个地址上去。
也就是说这里是发生了第二次重定向,码云让用户的浏览器重定向到了我们的回调地址上,并且加上授权码作为参数。
在我们的DEMO中,我们只需要在后台写一个requestMapping去相应回调地址的请求即可:
在这里插入图片描述
到了这一步,我们网站的后台就能拿到码云传递给我们的授权码。上面的两次重定向的作用分别是让浏览器去访问码云(认证服务器)的授权许可页面,以及授权成功后再让浏览器重定向回我们自己网站的某个页面。
拿到授权码后,我们的后台需要再次向码云发起请求,用授权码去换令牌,这里可能会有疑问,为什么要多此一举,用户同意授权后直接把令牌发给我们网站不就行了吗?最显而易见的一个原因就是,码云让浏览器重定向回我们自己的网站的时候,浏览器的地址栏是可以看到回调地址以及绑定参数的,也就是说如果将令牌像授权码一样直接绑定到回调地址的参数后,令牌是会泄露的。
所以我们需要在后台先获取授权码,然后在后台去申请交换令牌。
在这里插入图片描述
上面的代码只有参考意义,可以有不同的实现方式。在代码中,换取令牌的请求地址以及需要传递哪些参数,在认证服务提供方的接入说明页面都会由详细的API和介绍流程,每个厂家的地址都不一样。我们需要注意的是在这次请求中,我们除了需要附上授权码,client_id,回调地址外,还需要附上client_sercret,这个参数的值,在注册应用的时候会由认证服务提供方给我们。
请求发送之后,我们就可以拿到令牌,也就是accessToken。
可以看到在上面的步骤中,除了需要验证授权码外,还要再次验证被授权方(也就是我们的网站)的身份,通过client_id和client_secret来实现,整个过程包括client_secret和获取到的令牌的值都只在我们网站的后台发生和出现,用户根本无法得知,从而进一步保证了oAuth2.0协议的安全性。
拿到令牌后,我们就可以去访问用户的资源,不同的厂家会提供不同的资源访问地址(查各个厂家提供的API),但是都会要求在请求地址后面加上令牌。
在这里插入图片描述
获取成功后,我们就能拿到用户的信息,从而让用户登录系统,跳转到指定页面。
在这里插入图片描述
所以对于用户而言,实际上他能看到的就是点击“码云登录”后,浏览器跳转到了码云的授权许可页面,点击同意授权后,浏览器又跳回了网站的登录成功欢迎页面,这个中间网站与码云之间的几次交互对于用户是完全透明的,用户实际上也不知道令牌是什么。
当然,上面这个Demo中,浏览器的地址不是很友好,我们还可以在回调请求方法最后再次重定向,将浏览器重定向到我们网站的首页或主页,
在这里插入图片描述
在这里插入图片描述
这样对于用户而言,完全就无法感知到点击完权人授权之后发生的一系列的事情,他只能看到登录成功并且进入网站主页了。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
OAuth2.0 单点登录是一个相对复杂的实现,需要多个步骤和不同的组件。以下是一个简单Demo,演示了如何使用 OAuth2.0 实现单点登录。 **步骤1:注册 OAuth2.0 应用程序** 首先,您需要注册一个 OAuth2.0 应用程序,以便其他应用程序可以使用它来进行单点登录。注册过程将根据您使用的身份验证提供程序而有所不同,但一般来说,您需要提供以下信息: - 应用程序名称 - 应用程序描述 - 回调 URL - OAuth2.0 提供程序的客户端 ID 和密钥 **步骤2:设置回调 URL** 回调 URL 是 OAuth2.0 提供程序将授权码发送回您的应用程序的 URL。您需要在您的应用程序中设置回调 URL,以便 OAuth2.0 提供程序可以将授权码发送回您的应用程序。 **步骤3:获取授权码** 在单点登录过程中,用户需要授权您的应用程序访问其信息。为了获取授权,您需要将用户重定向到 OAuth2.0 提供程序的授权 URL。用户将在此页面上输入其凭据,然后选择是否授权您的应用程序访问其信息。 当用户授权您的应用程序时,OAuth2.0 提供程序将重定向用户到您的应用程序的回调 URL,并为您的应用程序提供一个授权码。 以下是获取授权码的示例代码: ```python import requests client_id = 'your_client_id' client_secret = 'your_client_secret' authorization_base_url = 'https://example.com/oauth2/authorize' redirect_uri = 'https://localhost:8000/callback' token_url = 'https://example.com/oauth2/token' session = requests.Session() session.verify = False authorization_url, state = session.authorization_url( authorization_base_url, redirect_uri=redirect_uri) print('Please go here and authorize,', authorization_url) redirect_response = input('Paste the full redirect URL here:') session.fetch_token( token_url, authorization_response=redirect_response, client_secret=client_secret) ``` **步骤4:获取访问令牌** 一旦您有了授权码,就可以通过将其与您的 OAuth2.0 提供程序的客户端 ID 和密钥一起传递来获取访问令牌。访问令牌是一个长期有效的令牌,您可以在以后的所有请求中使用它来访问用户信息。 以下是获取访问令牌的示例代码: ```python import requests client_id = 'your_client_id' client_secret = 'your_client_secret' authorization_base_url = 'https://example.com/oauth2/authorize' redirect_uri = 'https://localhost:8000/callback' token_url = 'https://example.com/oauth2/token' session = requests.Session() session.verify = False authorization_url, state = session.authorization_url( authorization_base_url, redirect_uri=redirect_uri) print('Please go here and authorize,', authorization_url) redirect_response = input('Paste the full redirect URL here:') session.fetch_token( token_url, authorization_response=redirect_response, client_secret=client_secret) print(session.token) ``` **步骤5:使用访问令牌访问资源** 现在您已经有了访问令牌,您可以使用它来访问您的 OAuth2.0 提供程序的 API。在某些情况下,您可能需要向 API 提供其他信息,例如用户 ID 或其他参数。 以下是使用访问令牌访问资源的示例代码: ```python import requests access_token = 'your_access_token' api_endpoint = 'https://example.com/api/v1/user' response = requests.get(api_endpoint, headers={'Authorization': 'Bearer %s' % access_token}) print(response.json()) ``` 这是一个简单OAuth2.0 单点登录示例,演示了如何使用 OAuth2.0 实现单点登录。请注意,实际实现可能会更复杂,并涉及更多的步骤和安全性考虑。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值