OAuth2.0的第三方登录集成

本文处理方式适用于java服务端REST API

一,了解OAuth2.0

OAuth2.0是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。
而且本文涉及到的授权模式都是采用授权码模式(authorization code):
它的步骤如下:

(A)用户访问客户端,后者将前者导向认证服务器。
(B)用户选择是否给予客户端授权。
(C)假设用户给予授权,认证服务器将用户导向客户端事先指定的"重定向URI"(redirection URI),同时附上一个授权码。
(D)客户端收到授权码,附上早先的"重定向URI",向认证服务器申请令牌。这一步是在客户端的后台的服务器上完成的,对用户不可见。
(E)认证服务器核对了授权码和重定向URI,确认无误后,向客户端发送访问令牌(access token)和更新令牌(refresh token)。

下面是上面这些步骤所需要的参数。
A步骤中,客户端申请认证的URI,包含以下参数:

  • response_type:表示授权类型,必选项,此处的值固定为"code"
  • client_id:表示客户端的ID,必选项
  • redirect_uri:表示重定向URI,可选项
  • scope:表示申请的权限范围,可选项
  • state:表示客户端的当前状态,可以指定任意值,认证服务器会原封不动地返回这个值。

C步骤成功后,会返回一个授权码给你,即code,比如:
http://localhost:8091/b2bbuyer/thirdUser?code=AQSHW3H0TNFil9BaO3YgQut7yKW24nit9gz0VWuU7qPDg99tI7S9Vfh9QArtWPLAvsMMzOAkLosUt0USsDZ24iwSWVwpWaHIccVqpirVeNMS84-0vr0&state=987654321
此处你拿到code,就可以进行D步骤了。
E步骤会返回一个access_token,表示访问令牌。通过这个令牌,就可以进行获取信息操作了,比如:

二,获取应用参数

那么现在,我们就来以linkedin为例,开始配置一个应用吧。

1,使用linkedin账户登陆linkedin开发者中心,在My Apps下面创建一个自己的应用,并配置好授权重定向网址:

###2,保存验证密钥:

验证密钥
客户端编号: 81y22zvqidpz3
客户端密码: kDdSjSaCQeNt2nU

三,手动获取登录信息

###1,在浏览器请求url:https://www.linkedin.com/oauth/v2/authorization?response_type=code&client_id=81y22zvqid2pz3&redirect_uri=http://localhost:8091/loginn/linkedin&state=987654321,client_id就是刚刚申请的应用的客户端编号。

###2,在跳转的页面输入linkedin账号和密码,确认授权之后,会跳转到刚才传的redirect_uri,并且带上code,example:
http://localhost:8091/b2bbuyer/thirdUser?code=AQSHW3H0TNFil9BaO3YgQut7yKW24nit9gz0VWuU7qPDg99tI7S9Vfh9QArtWPLAvsMMzOAkLosUt0USsDZ24iwSWVwpWaHIccVqpirVeNMS84-0vr0&state=987654321

###3,拿到code,20秒内在postman中发送请求,example:

###4,用获取的access_token,在postman中请求,example:

结果如下:

{
“firstName”: “阿兰”,
“formattedName”: “冯阿兰 (Alan Feng)”,
“id”: “OBXrP4h10N”,
“lastName”: “冯”,
“numConnections”: 1
}

四,使用Spring Cloud OAuth2

1,阅读Spring官方的Spring boot 集成OAuth2文档,download code from github.

2,引入注解@EnableOAuth2Client,添加application.yml配置文件。example:
application.yml

3,读取配置文件参数:

class ClientResources {@NestedConfigurationPropertyprivate AuthorizationCodeResourceDetails client = new AuthorizationCodeResourceDetails();@NestedConfigurationPropertyprivate ResourceServerProperties resource = new ResourceServerProperties();public AuthorizationCodeResourceDetails getClient() {return client;}public ResourceServerProperties getResource() {return resource;}
}

4,添加filter

private Filter ssoFilter(ClientResources client, String path) {ExtOAuth2ClientAuthenticationProcessingFilter oAuth2ClientAuthenticationFilter = new ExtOAuth2ClientAuthenticationProcessingFilter(path);oAuth2ClientAuthenticationFilter.setAuthenticationSuccessHandler(successHandler());oAuth2ClientAuthenticationFilter.setAuthenticationFailureHandler(failureHandler());OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(client.getClient(), oauth2ClientContext);oAuth2ClientAuthenticationFilter.setRestTemplate(oAuth2RestTemplate);ExtUserInfoTokenServices tokenServices = new ExtUserInfoTokenServices(client.getResource().getUserInfoUri(),client.getClient().getClientId());tokenServices.setRestTemplate(oAuth2RestTemplate);oAuth2ClientAuthenticationFilter.setTokenServices(tokenServices);return oAuth2ClientAuthenticationFilter;}
@Bean@ConfigurationProperties("linkedin")public ClientResources linkedin() {return new ClientResources();}@Bean@ConfigurationProperties("facebook")public ClientResources facebook() {return new ClientResources();}private Filter ssoFilter() {CompositeFilter filter = new CompositeFilter();List<Filter> filters = new ArrayList<>();filters.add(ssoFilter(linkedin(), "/login/linkedin*"));filters.add(ssoFilter(facebook(), "/login/facebook"));filter.setFilters(filters);return filter;}

最后,在configure方法里,把filter添加进去:

http.addFilterBefore(ssoFilter(), BasicAuthenticationFilter.class);

五,集成Spring security问题处理

1,如何跳转到前端指定的url,而不是OAuth默认的链接

2,HeaderHttpSessionStrategy的方式会使无法保存授权通过的session

3,如何区分第三方登录的类型(Facebook or linkedin)

4,如何将拿到的登录信息写入Authentication的Principal

5,OAuth2如何将token信息写入redis

以上问题,以后作解

Springboot集成第三方登录(facebook,linkedin,github)相关推荐

  1. SpringBoot 集成第三方登录(微信、支付宝)

    SpringBoot 集成第三方登录 微信 1. 登录微信开发平台 1.在微信开发平台里面获取我们需要的AppID.AppSecret . 2.创建配置类 3. 开始自己的业务模块 1. 方便测试 支 ...

  2. SpringBoot项目中集成第三方登录功能

    SpringBoot项目中集成第三方登录功能 引言 1 环境准备 2 代码实现 3 第三方平台认证申请 4 打包和部署项目 5 第三方平台登录认证测试 6 参考文章 引言 最近想把自己在公众号上介绍过 ...

  3. 使用cocoaPods一键集成第三方登录(新浪微博,qq,微信)

    第三方登录是现在app很常用的功能,而这个功能我已经写过两三次了...每次都写大同小异的代码真的是很痛苦,而且每次都要根据说明去添加那些依赖库,配置linkFlag什么的,完全是体力活,所以一直想把这 ...

  4. Spring Boot 快速集成第三方登录功能

    Spring Boot 快速集成第三方登录功能 前言 此 demo 主要演示 Spring Boot 项目如何使用 史上最全的第三方登录工具 - JustAuth 实现第三方登录,包括 QQ 登录.G ...

  5. SpringBoot 集成第三方聚合支付 微信、支付宝

    SpringBoot 集成第三方聚合支付 1. 创建Spring Boot项目 2. 添加依赖 3. 配置支付宝.微信 4. 实现支付接口 5. 实现支付服务 6. 实现支付回调接口 7. 测试支付 ...

  6. Springboot集成社交登录功能(微博登录)以及Session共享

    Springboot集成社交登录功能 pom <dependency><groupId>org.apache.httpcomponents</groupId>< ...

  7. 网站集成第三方登录-微信登录

    网站集成第三方登录-微信登录 课程介绍 1. 第三方登录引入介绍; 2. 网站微信登录原理(重点);oauth2 3. 网站微信登录具体步骤(重点); 4. 常见疑问解答; 5. 功能实现 ...

  8. android 第三方登录界面,Android App集成第三方登录与换肤指南

    Android App集成第三方登录与换肤指南 文档编辑 概述 本文主要是介绍了如何通过开源框架快速支持QQ和微信登录,并介绍了如何实现app快速换肤 QQ登录接入 APP要支持QQ登录,需要先到腾讯 ...

  9. Spring Security技术栈学习笔记(十三)Spring Social集成第三方登录验证开发流程介绍

    开发第三方登录,我们必须首先要了解OAuth协议(本文所讲述的OAuth协议指的是OAuth2协议),本文首先简单介绍OAuth协议,然后基于Spring Social来阐述开发第三方登录需要做哪些准 ...

最新文章

  1. 【408预推免复习】计算机网络(谢希仁第七版)第二章——物理层
  2. axios请求拦截 做Loading加载
  3. stm32 内部sram大小_在SRAM、FLASH中调试代码的配置方法(附详细步骤)
  4. java map class_Java:声明一个包含两个相关泛型类型的Map(Map,Class ?extends ClassB )...
  5. javascript 面试题之一
  6. 搭建远程jupyter服务器并从本地连接,有浏览器的地方就有Python!
  7. python小软件实例教程_【趣味案例】用Python做一个时光回忆录小软件,女朋友当场流泪说非我不嫁!...
  8. html画图代码_python之matplotlib画图教程(1)
  9. 3Eclipse的下载、安装、配置
  10. Xianfeng轻量级Java中间件平台:权限管理
  11. OpenInventor笔记:线性坐标轴PoLinearAxis的使用
  12. 教学流程图怎么画?画流程图好用的软件
  13. 5G通信网络专题报告:新一轮移动通信网络建设迎来高潮
  14. 如何下载百度地图离线包并导入OruxMaps
  15. 学习Flutter:Hello Word篇
  16. oracle字符集问题
  17. c语言解除宏定义_3.3.5 取消宏定义和重新定义宏
  18. 密码学技术如何选型?终探量子计算通信的安全模型
  19. hello yocto
  20. js中国标准时间转换为yyyy-MM-dd

热门文章

  1. 如何在Linux虚拟器里新建跟目录,虚拟机linux 6 增加根目录
  2. ios mj_refresh 上拉、下拉、自定义header、footer、afn子类化
  3. 全国职业计算机学校排名,2020全国最好的计算机专业学校排名
  4. 【比特鹏哥C语言_1.初识C语言】
  5. 基于matlab的多元线性回归分析
  6. 0成本无VPS搭建私人导航、图床、音乐服务器 | vercel freewha
  7. 细谈keep_alive
  8. Linux之《荒岛余生》(三)内存篇
  9. 安卓设置keychain_共享keychain数据
  10. UCF Local Programming Contest 2016 计蒜客解(补)题报告