OAuth2.0
OAuth2.0
OAuth2.0是一种授权框架,用于授权第三方应用访问用户资源的方式。它允许用户将自己的信息(如照片、视频等)存储在一个服务提供商中,然后授权第三方应用访问这些信息,而无需提供用户名和密码给第三方应用。OAuth2.0通过向第三方应用提供访问令牌来实现这一目的,该访问令牌可以代表用户访问他们的资源。OAuth2.0还提供了与许多现有的授权和身份验证系统集成的机制,使第三方应用可以使用这些系统来验证用户身份。
OAuth2.0流程
OAuth 2.0是一种授权框架,用于通过第三方应用程序访问用户在另一个应用程序(如微信)上存储的受保护资源。
-
用户点击微信图标发送认证请求:用户在第三方应用程序(例如一个网站或应用)中点击微信图标,请求使用微信账户进行认证。
-
用户输入账户和密码:用户在弹出的微信登录页面中输入自己的微信账户和密码。
-
认证请求发送至微信服务器:第三方应用程序将用户输入的账户和密码等认证请求发送至微信服务器进行认证。
-
认证成功返回令牌:如果认证成功,微信服务器将返回一个令牌(access token)给第三方应用程序。
-
使用令牌获取用户信息:第三方应用程序可以使用令牌去微信服务器请求用户的头像、名字、性别等信息。
-
令牌验证:第三方应用程序将令牌再次发送至微信服务器进行验证,以确保令牌的有效性。
-
返回用户信息:如果令牌验证成功,微信服务器将返回用户的头像、名字、性别等信息给第三方应用程序。
-
与系统账户绑定:第三方应用程序可以将获取到的用户信息与其自己的系统账户进行绑定,以便后续的操作和个性化推荐等功能。
示例
步骤一:添加依赖 在你的pom.xml文件中添加以下依赖,以引入Spring Security和OAuth2的相关库:
<dependencies><!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- OAuth2 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency><!-- OAuth2 JWT --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-resource-server</artifactId></dependency>
</dependencies>
步骤二:配置Spring Security 在你的application.properties或application.yml文件中,添加以下配置:
spring.security.oauth2.client.registration.[client-id].client-id=[client-id]
spring.security.oauth2.client.registration.[client-id].client-secret=[client-secret]
spring.security.oauth2.client.registration.[client-id].authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.[client-id].redirect-uri=http://localhost:8080/login/oauth2/code/[client-id]
spring.security.oauth2.client.provider.[provider-name].authorization-uri=[authorization-uri]
spring.security.oauth2.client.provider.[provider-name].token-uri=[token-uri]
spring.security.oauth2.client.provider.[provider-name].user-info-uri=[user-info-uri]
spring.security.oauth2.client.provider.[provider-name].user-name-attribute=[user-name-attribute]
其中,[client-id]是你从提供商那里获得的客户端ID,[client-secret]是客户端密码,[provider-name]是提供商名称,[authorization-uri]是用于获取授权码的URI,[token-uri]是用于换取访问令牌的URI,[user-info-uri]是用于获取用户信息的URI,[user-name-attribute]是用户信息中的用户名属性。
步骤三:实现登录页面 创建一个登录页面,让用户以OAuth2提供商的身份登录,并授权访问你的应用程序。你可以使用Spring Security提供的默认登录页面,或者自定义一个登录页面。
步骤四:实现回调处理 在你的回调处理方法中,获取授权码和访问令牌,并将其存储在你的应用程序中。
@Controller
public class OAuth2LoginController {@Autowiredprivate OAuth2AuthorizedClientService authorizedClientService;@GetMapping("/login/oauth2/code/{client-id}")public String handleCallback(@RequestParam("code") String code,@RequestParam("state") String state,OAuth2AuthenticationToken authenticationToken) {OAuth2AuthorizedClient authorizedClient =((OAuth2AuthenticationToken) authentication).getAuthorizedClient();// 获取访问令牌String accessToken = authorizedClient.getAccessToken().getTokenValue();// 存储访问令牌// ...return "redirect:/";}
}
步骤五:保护资源 使用Spring Security来保护你的资源,确保只有授权的用户才能访问。
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/api/**").authenticated().and().oauth2Login();}
}
总结
OAuth2.0是一种授权框架,用于在不共享用户凭证的情况下,允许应用程序访问用户的资源。它提供了一种安全的、标准化的方式,允许用户授权第三方应用程序访问他们的资源,并且可以由用户随时撤销该访问权限。
OAuth2.0涉及以下几个主要角色:
-
资源拥有者(Resource Owner):用户拥有资源的所有者,可以授权第三方应用程序访问他们的资源。
-
客户端(Client):第三方应用程序,需要访问资源拥有者的资源。
-
授权服务器(Authorization Server):验证资源拥有者的身份,并颁发访问令牌给客户端。
-
资源服务器(Resource Server):存储和管理资源的服务器,可以根据访问令牌来控制资源的访问权限。
OAuth2.0的授权流程包括以下几个步骤:
-
客户端向授权服务器发送请求,请求授权访问某个资源。
-
授权服务器验证客户端的身份,并向客户端返回一个授权码。
-
客户端使用授权码向授权服务器请求访问令牌。
-
授权服务器验证授权码,并向客户端返回访问令牌。
-
客户端使用访问令牌向资源服务器请求访问资源。
-
资源服务器验证访问令牌,并向客户端返回资源。
OAuth2.0的主要优点是安全性和灵活性。它通过使用访问令牌来代替用户凭证,减少了第三方应用程序访问用户敏感信息的风险。同时,OAuth2.0还支持多种授权流程和多种身份验证方式,可以适应不同的应用场景和安全需求。
然而,OAuth2.0也存在一些安全风险,例如令牌劫持和跨站请求伪造(CSRF)攻击。为了减少这些风险,开发者需要采取一些额外的安全措施,如使用HTTPS协议传输令牌和实施严格的访问令牌验证机制。
相关文章:
OAuth2.0
OAuth2.0 OAuth2.0是一种授权框架,用于授权第三方应用访问用户资源的方式。它允许用户将自己的信息(如照片、视频等)存储在一个服务提供商中,然后授权第三方应用访问这些信息,而无需提供用户名和密码给第三方应用。OAu…...
测试testing10
测试testing10...
在Java中实现泛型(Generics)的深入解析
在Java中,泛型(Generics)是一个强大的工具,它允许我们在编译时定义类型参数,使代码更加灵活、可重用和类型安全。下面,我将从技术难点、面试官关注点、回答吸引力以及代码举例四个方面,详细解析…...
每周题解:繁忙的都市
题目链接 繁忙的都市 题目描述 城市 C 是一个非常繁忙的大都市,城市中的道路十分的拥挤,于是市长决定对其中的道路进行改造。城市 C 的道路是这样分布的:城市中有 n n n 个交叉路口,有些交叉路口之间有道路相连,两…...
linux之防火墙工具
netfilter Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中。 Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户…...
【Python】—— 高阶函数
目录 (一)体验高阶函数 (二)内置高阶函数 2.1 map() 2.2 reduce() 2.3 filter() Python中的高阶函数是指那些接受函数作为参数,或者返回函数作为结果的函数。这种特性让Python的函数编程能力非常强大&…...
逻辑分析仪 - 采样率/采样深度
采样深度(Sampling Depth) 采样深度指的是逻辑分析仪在一次捕获过程中可以记录的最大样本数量。简单来说,采样深度越大,逻辑分析仪可以记录的数据量就越多。这对于分析长时间的信号变化或复杂的信号序列非常重要。 采样率&#…...
【Maven打包将resources/lib/下的jar也打包进jar包中】
Maven打包将resources/lib/下的jar也打包进jar包中 !!!少走弯路 第一步 resources/lib/下引入jar ftp4j-1.7.2.jar替换为自己jar包的名称 <dependency><groupId>it.sauronsoftware.ftp4j</groupId><artifactId>ft…...
基于Java的地震震中附近城市分析实战
目录 前言 一、空间数据说明 1、空间查询 二、Java后台开发 1、模型层设计与实现 2、控制层设计与实现 三、Leaflet地图开发 1、地震震中位置展示 2、附近城市展示 3、成果展示 总结 前言 随着全球气候变化和地壳活动的不断演变,地震作为一种自然灾害&…...
【C语言】指针(三)
目录 一、字符指针 1.1 ❥ 使用场景 1.2 ❥ 有关字符串笔试题 二、数组指针 2.1 ❥ 数组指针变量 2.2 ❥ 数组指针类型 2.3 ❥ 数组指针的初始化 三、数组指针的使用 3.1 ❥ 二维数组和数组名的理解 3.2 ❥ 二维数组传参 四、函数指针 4.1 ❥ 函数的地址 4.2 ❥ 函数…...
【Linux】从零开始认识进程间通信 —— 管道
送给大家一句话: 人要成长,必有原因,背后的努力与积累一定数倍于普通人。所以,关键还在于自己。 – 杨绛 从零开始认识进程间通信 1 为什么要进程间通信2 进程如何通信3 进程通信的常见方式4 管道4.1 什么是管道4.2 管道通信的系…...
Top3专业课150满分,怎么考的?
这个系列会邀请上岸学长学姐进行经验分享~ 今天经验分享的同学是小马哥上海交大819的全程班学员,专业课150分满分,这位同学也是819期末考试的第一名,非常厉害!大家吸吸欧气! 初试成绩单 前言 先介绍下自己࿰…...
Windows Presentation Foundation(WPF)要点总结
Windows Presentation Foundation(WPF)是微软推出的一种用于构建Windows桌面应用程序的框架。自从WPF在.NET Framework 3.0中引入以来,它以其强大的功能和灵活性,逐渐成为开发人员构建现代、富用户界面应用程序的首选。本文将概述…...
【研发日记】嵌入式处理器技能解锁(一)——多任务异步执行调度的三种方法
文章目录 前言 Timer中断调度 Event中断调度 StateFlow调度 分析和应用 总结 参考资料 前言 近期在一些嵌入式系统开发项目中,在使用嵌入式处理器时,遇到了挺多费时费力的事情。所以利用晚上和周末时间,在这些方面深入研究了一下&…...
揭秘Python的魔法:装饰器的超能力大揭秘 ♂️✨
文章目录 Python进阶之装饰器详解1. 引言装饰器的概念与意义装饰器在Python编程中的作用 2. 背景介绍2.1 函数作为对象2.2 高阶函数 3. 装饰器基础3.1 理解装饰器3.2 装饰器的工作原理 4. 带参数的装饰器4.1 为什么需要带参数4.2 实现带参数的装饰器使用函数包裹装饰器使用类实…...
怎么一键消除路人?教你三个消除方法
怎么一键消除路人?在数字时代,摄影已成为我们记录生活、表达情感的重要方式。然而,完美的照片背后往往隐藏着一些不那么完美的元素——比如那些不经意间闯入镜头的路人。他们或许只是匆匆过客,但却足以破坏你精心构图的美好瞬间。…...
Android Settings系统属性读写
Settings系统属性存储均为xml,分三种: 1.global:所有的偏好设置对系统的所有用户公开,第三方APP有读没有写的权限; 源码地址:frameworks/base/core/java/android/provider/Settings.java 对应xml路径&…...
2024年,企业的人才管理怎么做?这5点是关键!
当今时代,各行各业都面临着激烈的竞争。这些竞争归根结底都是人才的竞争。企业若想在竞争中掌握主动权,实现基业长青,就必须努力留住人才,并充分发挥他们的积极性、主动性和创造性。因此,做好人才管理是企业实现长期可…...
数据库DDL语句
数据库DDL语句: 查询所有数据库: show databases;查询当前数据库的名称 select database();创建数据库 create database [if not exists] 数据库名 [default charset 字符集] [collate 排序规则]注意:排序规则指定后,它会影响…...
《艺术大观》知网艺术刊:可加急, 出刊上网快
《艺术大观》 《艺术大观》征文通知 《艺术大观》期刊诚邀学者、艺术家和文化工作者积极投稿,共同探索艺术领域的前沿问题,促进学术交流和艺术创作的发展。我们欢迎各类艺术形式的研究与评论,包括但不限于绘画、雕塑、音乐、舞蹈、戏剧、电…...
SpringBoot-17-MyBatis动态SQL标签之常用标签
文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...
Ubuntu系统下交叉编译openssl
一、参考资料 OpenSSL&&libcurl库的交叉编译 - hesetone - 博客园 二、准备工作 1. 编译环境 宿主机:Ubuntu 20.04.6 LTSHost:ARM32位交叉编译器:arm-linux-gnueabihf-gcc-11.1.0 2. 设置交叉编译工具链 在交叉编译之前&#x…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
高危文件识别的常用算法:原理、应用与企业场景
高危文件识别的常用算法:原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件,如包含恶意代码、敏感数据或欺诈内容的文档,在企业协同办公环境中(如Teams、Google Workspace)尤为重要。结合大模型技术&…...
【git】把本地更改提交远程新分支feature_g
创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
push [特殊字符] present
push 🆚 present 前言present和dismiss特点代码演示 push和pop特点代码演示 前言 在 iOS 开发中,push 和 present 是两种不同的视图控制器切换方式,它们有着显著的区别。 present和dismiss 特点 在当前控制器上方新建视图层级需要手动调用…...
