文章目录

  • 目标
  • 第三方登陆流程
    • 登陆流程
    • 必要概念了解
      • 授权码模式(Authorization Code)
  • 实现第三方登陆框架

目标

  • 了解第三方登陆流程

    参考:如何在Markdown中画流程图
    关于第三方登录,你应该知道的

    Spring Security 实战 书籍

    JustAuth与用户系统整合

本文分三篇来介绍第三方登陆的实现。

第三方登陆流程

许多人应该对第三方登陆不陌生,当你登陆某网站,会发现在登陆选项中,允许使用其他平台账户登陆。比如微信,QQ,微博等方式。

登陆流程

以Gitee 这个网站的第三方登陆示例:我们希望通过Github账户,登陆Gitee网站。

大致分为三步:

1,点击github登陆,跳转到Github授权页面(如果已经绑定了该Github账户,会直接登陆成功,跳转到gitee的主页)

2,点击授权按钮,允许Gitee获取当前用户的信息。

3,跳转到Gitee的登陆绑定页面,绑定账户,实现登陆。(当然也可以不绑定本地账户,直接登陆成功。看业务定制需求)

必要概念了解

参考 :开箱即用的整合第三方登录的开源组件 建议将必读部分阅读完成 或者阅读 Spring Secuirty 第三部分内容

建议先阅读上述内容。

第三方登陆的实现基于OAuth2 协议来实现:

  • OAuth 开发授权(Open Authorization)

    OAuth 解决了在用户不提供密码给第三方应用的情况下,让第三方应用有权获取用户数据以及基本信息的难题。OAuth 分为OAuth 1.0 和 OAuth 2.0 ,OAuth1.0已经基本退出历史舞台,所以了解OAuth 2.0即可。

    OAuth2 的授权流程大致分为四种角色:

    • 资源所有者(Resource Owner):通常指用户自己,例如每一个Github用户

    • 客户端(Client):指需要获取用户资源的网站,上述的 Gitee 网站就是客户端。

    • 资源服务器(Resource Server):指存储了用户资源的服务器,上述的Github网站就存储了你的用户信息

    • 认证服务器(Authorization Server): 验证资源所有者(用户信息),并在验证成功后发放相关访问令牌(Access Token)给客户端。

    资源服务器和认证服务器可以是同一个。

    OAuth2 提供了四种授权机制:

    1. Authorization Code 授权码模式

      授权码模式是功能最完整、流程最严密的授权模式,它将用户引导到授权服务器进行身份验证,
      授权服务器将发放的访问令牌传递给客户端。

    2. 隐式授权模式(Implicit)

      结合移动应用或 Web App 使用

    3. 密码授权模式(Password Credentials)

      适用于受信任客户端应用,例如同个组织的内部或外部应用

    4. 客户端授权模式(Client Credentials)

      适用于客户端调用主服务API型应用(比如百度API Store)

授权码模式(Authorization Code)

着重介绍一下这个模式流程,接下来的代码实现,都基于这种模式:(下图不是原图,修改了部分)

     +----------+| Resource ||   Owner  ||   用户   |+----------+^|(B)+----|-----+          Client Identifier      +---------------+|         -+----(A)-- & Redirection URI ---->|               ||  User-   |                                 | Authorization ||  Agent  -+----(B)-- User authenticates --->|     Server    || 用户代理  |                                 |   认证服务器   ||         -+----(C)-- Authorization Code ---<|               |+-|----|---+                                 +---------------+|    |                                         ^      v(A)  (C)                                        |      ||    |                                         |      |^    v                                         |      |+---------+                                      |      ||         |>---(D)-- Authorization Code ---------'      ||         |          & Redirection URI                  ||         |                                             ||         |<---(E)----- Access Token -------------------'|  Client |       (w/ Optional Refresh Token)|  客户端  ||         |                                    +---------------+|         |----(F)------ Access Token -------->|    Resource   ||         |                                    |     Server    ||         |<---(G)-- Protected Resource -------|   资源服务器   |+---------+                                    +---------------+

参见:授权码

用户代理(User-Agent),可以理解为web浏览器。这里依然以 Gitee网站使用Github账户登录举例。

Github 授权OAuth应用 文档

A:用户发起第三方登陆请求,客户端通过浏览器请求认证服务器地址,并携带了客户端id(Client Identifier)和回调地址(Redirection URI)参数,认证服务器在浏览器端显示,授权页面。(图示第二个图)
Github 的请求用户身份地址,携带了client_id和redirect_uri的参数:

 GET https://github.com/login/oauth/authoriz?client_id=e1015c0a10dc5e11b718&redirect_uri=http://localhost:8081/api/v1/oauth/callback/github

B:用户选择是否授予访问权限

C:点页面上的同意,认证服务器会回调客户端Redirection URI这个地址,并携带code 参数返回

Github 回调客户端地址:

 GET http://localhost:8081/api/v1/oauth/callback/github?code=28ba84fe6fbbb895f1e6&state=a885aad30100738a7d26018f9ec52c17

D: 客户端获得认证服务器返回的code 参数,然后再发送获取令牌请求到认证服务器,并携带code参数

Github 获取token的请求:需要三个参数

POST https://github.com/login/oauth/access_tokenclient_id    string  需要。您从GitHub收到的GitHub App的客户端ID。
client_secret   string  需要。您从GitHub收到的GitHub App的客户密码。
code    string  需要。您收到的作为对步骤1的响应的代码。

E: 认证服务器根据code等参数,返回 access_token

F:客户端拿着 access_token 去请求资源服务器

Github 获取用户信息请求:

Authorization: token OAUTH-TOKEN
GET https://api.github.com/user

G:资源服务器返回受保护的资源,也就是目标用户信息

参数解释:

clientId 客户端身份标识符(应用id),一般在申请完Oauth应用后,由第三方平台颁发,唯一
clientSecret 客户端密钥,一般在申请完Oauth应用后,由第三方平台颁发
redirectUri 开发者项目中的有效api地址。用户在确认第三方平台授权(登录)后,第三方平台会重定向到该地址,并携带code等参数

实现第三方登陆框架

  • Spring Social

    Spring Social是一个专门用于连接社交平台,实现OAuth服务共享的框架。

    github地址:https://github.com/spring-projects/spring-social

    被spring官方抛弃,不建议使用,已经很长时间没有更新了。

    spring官方为什么放弃spring social项目及替代方案

  • JustAuth

    JustAuth,如你所见,它仅仅是一个第三方授权登录工具类库,它可以让我们脱离繁琐的第三方登录 SDK,让登录变得So easy!

    github地址:https://github.com/justauth/JustAuth

    国人开发,不断更新中,不依赖于Spring 框架,支持国内大多数平台的登陆,使用还是很简单的,如果不对接Spring Security框架推荐使用

  • Spring Security OAuth2

    默认提供了对Goole,Github,Facebook,Okta 这些平台的第三方登陆支持,如果需要定制其他第三方登陆增加代码实现即可。

    github地址:https://github.com/spring-projects/spring-security

    提供了Oauth2的解决方案,如果用于对接Spring Security 建议使用

    文档:spring -security官方Oauth2文档示例

听说点赞关注的人,身体健康,一夜暴富,升职加薪迎娶白富美!!!

点我领取每日福利
微信公众号:耿子blog
GitHub地址:gengzi

SpringSecurity实战(七)-对接第三方登陆-流程分析相关推荐

  1. Alian解读SpringBoot 2.6.0 源码(七):启动流程分析之准备应用上下文

    目录 一.背景 1.1.run方法整体流程 1.2.本文解读范围 二.准备应用上下文 2.1.整体流程 2.2.设置环境 2.3.应用上下文进行后置处理 2.4.应用所有初始化器 2.5.发布应用上下 ...

  2. Android对接第三方登陆+支付(google+facebook)

    由于近期项目,要用到google+登陆和google  play商店应用内商品支付,以及facebook登陆 所以经过查看官网介绍和示例应用来实现下其中的功能, 下面是使用中遇到的问题,希望对你有用! ...

  3. PackageManagerService启动详解(七)之扫描系统应用安装目录阶段流程分析

    PKMS启动详解(七)之BOOT_PROGRESS_PMS_SYSTEM_SCAN_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系 ...

  4. PackageManagerService启动详解(三)之开始初始化阶段流程分析

      PKMS启动详解(三)之BOOT_PROGRESS_PMS_START阶段流程分析 Android PackageManagerService系列博客目录: PKMS启动详解系列博客概要 PKMS ...

  5. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(中)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.调用后处理器 2.1.调用在上下文中注册为beanFactory的后置处理器 2.2.invokeBeanFactoryPostP ...

  6. Alian解读SpringBoot 2.6.0 源码(八):启动流程分析之刷新应用上下文(下)

    目录 一.背景 1.1.刷新的整体调用流程 1.2.本文解读范围 二.初始化特定上下文子类中的其他特殊bean 2.1.初始化主体资源 2.2.创建web服务 三.检查监听器bean并注册它们 四.实 ...

  7. SpringSecurity - 启动流程分析(八)- CsrfFilter 过滤器

    ​ ​ 活动地址:CSDN21天学习挑战赛 前言 在 SpringSecurity - 启动流程分析(五)- (七) 这几篇文章中,我们主要是对 UsernamePasswordAuthenticat ...

  8. springSecurity的学习笔记--使用spring-Security完成表单登陆,手机验证码登陆,第三方登陆

    环境搭建好后,之后的练习进入了一个十分痛苦的阶段!! 但是与此同时,收获也是比较可观的. 老师通过详细的视频讲解,完成了表单登陆,包括账号密码和验证码登陆,手机验证码登陆,第三方登陆. 每一个部分都进 ...

  9. 新浪微博第三方登陆开发流程及常见问题

    搞一个新浪微博第三方登陆费了我半天时间,现在把它的流程简单写一下,希望读者可以少走弯路. 大部分第三方登陆都是采用OAuth2.0接入方式(详见),我们所开发的网站项目可以使用两种方式进行接入: (1 ...

  10. ArcGIS水文分析实战教程(13)流域提取流程

    ArcGIS水文分析实战教程(13)流域提取流程 本章导读:这里的流域是一个自然概念,而不是行政概念,或者称之为集水区更加合理一些.在流域提取中,其过程都是先定义河流然后才能通过河流定义流域.其中流域 ...

最新文章

  1. st link v2引脚连接_ST-Link资料02_ST-Link固件介绍,及固件命名规则
  2. Java开发2018年值得学习的10大技术
  3. 20135316王剑桥 linux第六周课实验笔记
  4. BZOJ 2631 tree(动态树)
  5. nginx服务器部署dist文件夹
  6. Atitit 2017年第68界机器视觉图像处理学术大会会议记要attilax总结自建学院自颁学位理论
  7. 学习总结-《父与子的编程之旅》chapter 18
  8. 关于keystore 文件生成PK8+PEM文件
  9. VS2003安装步骤及其错误
  10. pci-e服务器显卡性能,旗舰显卡不同PCI-E模式下性能对比测试
  11. php代码审计命令执行,PHP代码审计笔记--命令执行漏洞
  12. 蚂蚁微贷互动营销技术体系实践
  13. 电脑桌面计算机找不到,电脑桌面没有了怎么恢复?电脑桌面没有了的恢复方法...
  14. win7搜不到特定网络
  15. golang —— go语言科学记数法使用
  16. CentOS Linux 续存,在新的 AlmaLinux 9 中发光发热
  17. ngrok转发mysql连接_ngrok内网转发
  18. C语言初阶-C语言中static的用法
  19. 悔不当初:没人能随随便便成功
  20. python个人所得税怎么写分录_个人所得税的凭证分录怎么写

热门文章

  1. bootstrap框架中的分割线
  2. tabLayout 设置分割线
  3. autoCAD2014安装激活
  4. c r 语言教程,R语言初级教程
  5. xmake v2.5.9 发布,改进 C++20 模块,并支持 Nim, Keil MDK 和 Unity Build
  6. 第六章金融衍生工具市场
  7. DEVC++安装后编程运行时老是提示“源文件未编译”
  8. 【示波器专题】示波器探头的原理深入——有源探头之电流探头
  9. Linux常用命令-2
  10. Vj程序设计作业H5