php授权码授权码,OAuth 系列(二)授权码模式 Authorization Code

授权码模式 (Authorization Code) 是最常见的 OAuth 授权类型;

它的流程相对于其他模式是最复杂也是最完善的;

我们这里还以 白俊遥博客 和 github 做示例;

拼接链接

获取 code 需要拼接一个链接;

这个过程是在第三方客户端完成的即 白俊遥博客;

在白俊遥博客上有一个 github 登陆按钮;

4ecc9ffe2c696fd4184559af2bf96a3b.png

放在按钮上我们可以看到链接是: https://baijunyao.com/auth/oauth/redirectToProvider/github ;

当访问这个链接的时候 白俊遥博客 会跳转到 https://github.com/login/oauth/authorize ;

请求方式: GET

请求链接: https://github.com/login/oauth/authorize

并拼接携带如下参数:

response_type: code

client_id: xxx

redirect_uri: https://baijunyao.com/auth/oauth/handleProviderCallback/github

scope: user:email

state: xxx

response_type 固定参数这里就是 code ;

client_id 是白俊遥博客在 github 上申请的;

redirect_uri 是当在 github 授权后会跳回来的链接;

scope 要申请的权限;

state 白俊遥博客随机生成的一个字符串是为了安全;

完整的链接就是这样的: https://github.com/login/oauth/authorize?client_id=xxx&redirect_uri=https%3A%2F%2Fbaijunyao.com%2Fauth%2Foauth%2FhandleProviderCallback%2Fgithub&scope=user%3Aemail&response_type=code&state=xxx

获取 code

上一步我们跳转到了 https://github.com/login/oauth/authorize ;

到 github 后会先判断是否已经登录;

如果没有登录则会显示登录的页面;

6a10eb906267bc73ef716b982cf9e61a.png

请注意这里的链接是 github 的;

页面也是 github 的;

也就是说这个过程输入的账号密码 白俊遥博客 是获取不到的;

当登录后会跳转到授权页面;

c2ec19f2bc79f65992e5f8e20dccdfcd.png

要获取的权限就是上一步中的 scope 的值即 user:email;

当用户点击授权按钮后就会跳转回到上一步中的 redirect_uri ;

请求方式: GET

请求链接: https://baijunyao.com/auth/oauth/handleProviderCallback/github

并携带如下参数:

code: xxx

state: xxx

code 是用来在下一步获取 token ;

state 是上一步生成的随机字符;

获取 token

现在 白俊遥博客 已经拿到了 code ;

接着在 白俊遥博客 服务器上会向 github 发一个获取用户信息的请求;

请求方式: POST

链接: https://github.com/login/oauth/access_token ;

请求参数如下:

grant_type: authorization_code

code: xxx

client_id: xxx

client_secret: xxx

redirect_uri: https//baijunyao.com/auth/oauth/handleProviderCallback/github

state: xxx

grant_type 固定值为 authorization_code

code 是上一步获取到的 code ;

client_id 是白俊遥博客在 github 上申请的;

client_secret 是白俊遥博客在 github 上申请的;

redirect_uri 跟第一步拼接链接中的 redirect_uri 一致;

state 是之前生成的随机字符;

此请求的返回值如下:

{

"token_type": "Bearer",

"expires_in": xxx,

"access_token": "xxx",

"refresh_token": "xxx",

}

token_type 是 token 类型一般是 Bearer ;

expires_in 过期时间

access_token 用于访问资源的令牌

refresh_token 用于刷新 access_token

刷新 token

当 access_token 过期后我们可以使用 refresh_token 获取新的 access_token ;

刷新 access_token 的方式如下:

请求类型: POST

请求链接: https://github.com/login/oauth/refresh_token ;

请求参数如下:

grant_type: refresh_token

refresh_token: xxx

scope: user:email

刷新 token 的返回值跟获取 token 步骤中的返回值一样;

至此完整的授权码模式流程就完成了;

我们最终拿到了 access_token ;

access_token 就如同用户的账号密码;

白俊遥博客 拿着 access_token 就可以去 github 获取用户的信息;

而这整个过程中用户并没有把账号密码给 白俊遥博客;

而且 白俊遥博客 只能获取经过授权的用户信息数据;

完全满足我们上篇文章 OAuth 系列(一)序言 中的各种需求;

OAuth 是一项协议;

各个平台实现的方式不完全相同;

这里只是以 github 举例;

为了跟 OAuth 官方的协议保持一致;

上面示例中的一些返回值跟实际的 github 文档中的并不完全相同;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot是一个开箱即用的Java开发框架,而授权模式Authorization Code Grant)是OAuth 2.0的一种授权方式。在授权模式,客户端先将用户重定向到认证服务器,然后经过用户登录并确认授权后,认证服务器会生成授权,客户端再将授权发送给认证服务器以获取访问令牌。 在Spring Boot实现授权模式自定义页面,可以按照以下步骤进行: 1. 创建自定义页面:首先,在Spring Boot项目的resources目录下创建一个public目录,并在该目录下创建一个login.html页面用于用户登录授权确认。 2. 配置认证服务器:在Spring Boot项目的配置文件(如application.properties或application.yml)配置认证服务器相关的属性,包括认证服务器的端口、重定向URL等。 3. 创建授权端点:在Spring Boot项目创建授权端点,即用于接收并响应用户的授权请求。可以使用Spring Security和OAuth 2.0的相关类和注解来实现授权端点的功能。 4. 自定义登录授权页面:在授权端点的处理方法,根据用户的请求判断是否需要展示登录页面或授权确认页面。如果需要展示页面,则返回自定义的login.html页面。 5. 处理用户登录授权:在登录页面,用户输入登录信息后,通过表单提交到授权端点的处理方法进行验证。验证成功后,生成授权并重定向到客户端指定的重定向URL。在授权确认页面,用户确认授权后,同样生成授权并重定向到客户端。 通过以上步骤,就可以在Spring Boot实现授权模式的自定义页面。根据实际需求,可以根据自己的业务逻辑对登录授权页面进行自定义和美化,提升用户体验。同时,也需要注意安全性,避免出现安全漏洞。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值