OAuth 2.0

简介

OAuth 是一种开放标准的授权协议或框架,它提供了一种安全的方式,使第三方应用程序能够访问用户在其他服务上的受保护资源,而无需共享用户的凭证(如用户名和密码)。OAuth 的核心思想是通过“授权令牌”来代替直接使用用户名和密码进行身份验证。OAuth 不是属于任何一家公司的产品或服务。OAuth 是一个开放标准的授权框架,它由互联网工程任务组(IETF)定义,并通过社区贡献不断发展和完善。
OAuth 的开发和维护是由多个组织和个人共同参与的,不是由单一公司控制或拥有的。因此,它被广泛应用于各种互联网服务中,包括但不限于Google、Facebook、Twitter、Microsoft等大公司提供的服务。这些公司实现了OAuth协议来支持第三方应用的安全授权流程。
OAuth 名字里面的O代表Open,名字里的Auth是 “Authentication”(身份验证)或 “Authorization”(授权)的缩写。OAuth 的全称可以理解为 Open Authorization 或 Open Authentication,
主要特点

  • 安全性:避免了直接暴露用户的敏感信息,减少了潜在的安全风险。
  • 灵活性:支持多种授权模式,适用于不同的应用场景。
  • 广泛适用性:被众多互联网服务提供商采用,如WeiChat、Google、Facebook、Twitter等。

OAuth 1.0 和 OAuth 2.0 的区别

OAuth 1.0 和 OAuth 2.0 是两种不同的授权协议版本,虽然它们的目标都是为了安全地授权第三方应用访问用户资源,但在设计和实现上有显著差异。以下是两者的主要区别:

  1.  签名机制
    - OAuth 1.0:
      - 使用复杂的签名算法(如 HMAC-SHA1 或 RSA-SHA1)对每个请求进行签名。
      - 需要在每次请求中包含签名参数,增加了开发和调试的复杂性。
    - OAuth 2.0:
      - 不再强制要求对每个请求进行签名,而是依赖于传输层安全(TLS/SSL)来保护通信。
      - 简化了客户端的实现,减少了出错的可能性。
  2. 授权类型
    - OAuth 1.0:
      - 主要支持“三腿”(Three-legged)授权流程,即涉及客户端、用户和授权服务器。
    - OAuth 2.0:
      - 支持多种授权类型,包括但不限于:
        - 授权码模式(Authorization Code):适用于Web应用程序。
        - 隐式模式(Implicit):适用于浏览器或移动应用等无法安全存储密钥的客户端。
        - 密码模式(Resource Owner Password Credentials):适用于信任度高的客户端。
        - 客户端凭证模式(Client Credentials):适用于客户端直接访问资源而无需用户参与的场景。
  3. 令牌类型
    - OAuth 1.0:
      - 使用临时令牌(Request Token)和访问令牌(Access Token),需要额外的步骤来交换临时令牌为访问令牌。
      
    - OAuth 2.0:
      - 直接使用访问令牌(Access Token),简化了流程。
      - 引入了刷新令牌(Refresh Token),允许在访问令牌过期后获取新的访问令牌,而不需要再次让用户授权。
  4. 安全性
    - OAuth 1.0:
      - 依赖于签名机制来确保请求的完整性和真实性,但签名算法复杂且容易出错。
      
    - OAuth 2.0:
      - 更加依赖于HTTPS/TLS来保证通信的安全性,简化了安全配置。
      - 提供了更灵活的安全选项,例如通过短寿命的访问令牌和刷新令牌来增强安全性。
  5. 易用性和灵活性
    - OAuth 1.0:
      - 实现较为复杂,尤其是签名算法的处理,增加了开发和维护成本。
      
    - OAuth 2.0:
      - 设计更加简洁,易于实现和集成。
      - 提供了更多的灵活性,适用于各种类型的客户端和应用场景。
  6. 社区和支持
    - OAuth 1.0:
      - 已经逐渐被弃用,社区支持较少。
      
    - OAuth 2.0:
      - 广泛采用,拥有活跃的社区和丰富的文档及工具支持。

 总结
OAuth 2.0 在多个方面进行了改进,简化了授权流程,增强了灵活性,并依赖现代的安全措施(如TLS)。因此,OAuth 2.0 成为了当前最常用的授权协议版本,广泛应用于各种Web和移动应用中。

OAuth 2.0 的主要角色

  •  资源所有者(Resource Owner):通常是用户,拥有受保护资源的人。
  • 客户端(Client):希望访问受保护资源的应用程序,或三方应用程序。
  • 授权服务器(Authorization Server):负责颁发访问令牌。
  • 资源服务器(Resource Server):存储受保护资源并根据访问令牌提供资源。 

OAuth 2.0授权时序图

OAuth 2.0的授权与身份验证

 1. 授权(Authorization)

 OAuth 2.0 提供了多种授权模式(Grant Types),每种模式适用于不同的应用场景。以下是常见的授权模式及其技术实现:

 1.1 授权码模式(Authorization Code Grant)

- 适用场景:Web应用、移动应用等需要高安全性且能够安全存储客户端密钥的应用。
- 技术实现:
  - 重定向URI(redirect_uri):用户授权后,授权服务器将用户重定向到指定的URL,并附带授权码。
  - 授权码(Authorization Code):临时代码,用于换取访问令牌。
  - 客户端凭证(Client Credentials):客户端ID和客户端密钥,用于验证客户端身份。
  - TLS/SSL:确保通信的安全性。

 1.2 隐式模式(Implicit Grant)

- 适用场景:浏览器应用、单页应用(SPA)等无法安全存储客户端密钥的应用。
- 技术实现:
  - 重定向URI(redirect_uri):用户授权后,授权服务器直接将访问令牌附加到重定向URI的片段标识符中。
  - 访问令牌(Access Token):直接返回给客户端应用,无需额外步骤。
  - TLS/SSL:确保通信的安全性。

 1.3 密码模式(Resource Owner Password Credentials Grant)

- 适用场景:信任度高的客户端应用,如第一方应用。
- 技术实现:
  - 用户名和密码:用户直接提供凭证给客户端应用。
  - 客户端凭证(Client Credentials):客户端ID和客户端密钥,用于验证客户端身份。
  - TLS/SSL:确保通信的安全性。

 1.4 客户端凭证模式(Client Credentials Grant)

- 适用场景:客户端直接访问资源而无需用户参与的场景,如服务到服务通信。
- 技术实现:
  - 客户端凭证(Client Credentials):客户端ID和客户端密钥,用于验证客户端身份。
  - TLS/SSL:确保通信的安全性。

同时如果当访问令牌过期时,客户端可以使用刷新令牌来请求新的访问令牌,而不需要用户重新进行身份验证。

2. 验证(Authentication and Validation)

 2.1 访问令牌验证(Access Token Validation)

- JWT格式的访问令牌:
  - 签名验证:使用公钥或对称密钥验证JWT的签名,确保令牌未被篡改。
  - 过期时间检查:验证'exp'(过期时间)声明,确保令牌仍在有效期内。
  - 受众检查:验证'aud'(受众)声明,确保令牌是发给当前应用的。
  - 签发者检查:验证'iss'(签发者)声明,确保令牌来自可信的授权服务器。

- 不透明的访问令牌:
  -  introspection 端点:通过调用授权服务器的'/token/introspect'端点,验证令牌的有效性和其他属性。

 2.2 ID Token 验证(仅限OpenID Connect)

- 签名验证:使用公钥或对称密钥验证JWT的签名,确保ID Token未被篡改。
- 过期时间检查:验证'exp'(过期时间)声明,确保ID Token仍在有效期内。
- 受众检查:验证'aud'(受众)声明,确保ID Token是发给当前应用的。
- 签发者检查:验证'iss'(签发者)声明,确保ID Token来自可信的授权服务器。
- nonce检查:验证'nonce'声明,确保ID Token与原始授权请求中的'nonce'参数匹配,防止重放攻击。
- at_hash检查:如果同时使用了访问令牌,验证'at_hash'声明以确保访问令牌和ID Token的一致性。

使用Spring搭建OAuth 2.0 服务

1.创建Spring项目

2. 添加OAuth2 依赖

<dependencies><!-- Spring Boot Starter Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- Spring Security --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!-- Spring Security OAuth2 Authorization Server --><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-authorization-server</artifactId><version>0.2.3</version> <!-- 请使用最新版本 --></dependency><!-- Spring Data JPA --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- H2 Database --><dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope></dependency><!-- Spring Boot DevTools --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><!-- Lombok --><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><!-- Spring Boot Starter Test --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

3. 配置数据库

spring:datasource:url: jdbc:h2:mem:testdbdriver-class-name: org.h2.Driverusername: sapassword:h2:console:enabled: truepath: /h2-consolejpa:hibernate:ddl-auto: updateshow-sql: trueproperties:hibernate:format_sql: true

 4. 配置Spring Security

 创建一个配置类来设置Spring Security,包括用户认证和授权服务器配置。

4.1. 创建用户实体和仓库

首先,创建一个简单的用户实体和JPA仓库。
User.java  

package com.example.oauth2server.model;import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;import javax.persistence.*;
import java.util.Collection;
import java.util.List;@Entity
@Data
public class User implements UserDetails {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Long id;private String username;private String password;@Overridepublic Collection<? extends GrantedAuthority> getAuthorities() {return List.of(new SimpleGrantedAuthority("ROLE_USER"));}@Overridepublic boolean isAccountNonExpired() {return true;}@Overridepublic boolean isAccountNonLocked() {return true;}@Overridepublic boolean isCredentialsNonExpired() {return true;}@Overridepublic boolean isEnabled() {return true;}
}

UserRepository.java

package com.example.oauth2server.repository;import com.example.oauth2server.model.User;
import org.springframework.data.jpa.repository.JpaRepository;public interface UserRepository extends JpaRepository<User, Long> {User findByUsername(String username);
}
4.2. 配置用户认证

创建一个配置类来设置用户认证。
SecurityConfig.java 

package com.example.oauth2server.config;import com.example.oauth2server.model.User;
import com.example.oauth2server.repository.UserRepository;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;@Configuration
public class SecurityConfig {private final UserRepository userRepository;public SecurityConfig(UserRepository userRepository) {this.userRepository = userRepository;}@Beanpublic UserDetailsService userDetailsService() {return username -> userRepository.findByUsername(username).orElseThrow(() -> new UsernameNotFoundException("User not found"));}@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
 4.3. 配置授权服务器

创建一个配置类来设置授权服务器。
AuthorizationServerConfig.java

package com.example.oauth2server.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer;
import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.security.oauth2.provider.token.store.InMemoryTokenStore;@Configuration
@EnableAuthorizationServer
@Order(1)
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter {private final PasswordEncoder passwordEncoder;public AuthorizationServerConfig(PasswordEncoder passwordEncoder) {this.passwordEncoder = passwordEncoder;}@Overridepublic void configure(AuthorizationServerSecurityConfigurer security) throws Exception {security.tokenKeyAccess("permitAll()").checkTokenAccess("isAuthenticated()");}@Overridepublic void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {endpoints.tokenStore(tokenStore());}@Beanpublic TokenStore tokenStore() {return new InMemoryTokenStore();}@Overridepublic void configure(org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer clients) throws Exception {clients.inMemory().withClient("client").secret(passwordEncoder.encode("secret")).authorizedGrantTypes("authorization_code", "refresh_token", "password").scopes("read", "write").redirectUris("http://localhost:8080/callback").accessTokenValiditySeconds(3600).refreshTokenValiditySeconds(2592000);}
}
4.4. 配置资源服务器

 创建一个配置类来设置资源服务器。
ResourceServerConfig.java

package com.example.oauth2server.config;import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableResourceServer;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter {@Overridepublic void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/oauth/**").permitAll().anyRequest().authenticated();}
}
4.5. 创建控制器
package com.example.oauth2server.controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class HelloController {@GetMapping("/getAuth")public String hello() {return xxxx.xxx();}
}
 4.6. 初始化数据
package com.example.oauth2server.config;import com.example.oauth2server.model.User;
import com.example.oauth2server.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.password.PasswordEncoder;@Configuration
public class DataLoader {@Autowiredprivate UserRepository userRepository;@Autowiredprivate PasswordEncoder passwordEncoder;@Beanpublic CommandLineRunner dataLoader() {return args -> {if (userRepository.findByUsername("user") == null) {User user = new User();user.setUsername("user");user.setPassword(passwordEncoder.encode("password"));userRepository.save(user);}};}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/495698.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IntelliJ IDEA 远程调试

IntelliJ IDEA 远程调试 在平时开发 JAVA 程序时&#xff0c;在遇到比较棘手的 Bug 或者是线上线下结果不一致的情况下&#xff0c;我们会通过打 Log 或者 Debug 的方式去定位并解决问题&#xff0c;两种方式各有利弊&#xff0c;今天就简要介绍下如何通过远程 Debug 的情况下…

美国辅料查询之FDA批准药用辅料数据库(IID数据库)

药用辅料的性质很大程度上决定了制剂的性质&#xff0c;每一种新的药用辅料的问世&#xff0c;都会为制剂技术的发展带来新的机遇&#xff0c;每一种药用辅料都可能让制剂研发员开发出新剂型药物&#xff0c;所以在药物制剂研发过程中&#xff0c;药用辅料的信息调研是不可或缺…

YOLOv10目标检测-训练自己的数据

yolov10 https://github.com/THU-MIG/yolov10?tabreadme-ov-file 1. 数据集 模型的建立需要收集图片并且进行标注。YOLOv10标注的文件格式如下&#xff08;每张图片对应一个标签文件&#xff09;&#xff1a; 0 0.441753 0.815461 0.061021 0.042763 1 0.395895 0.759868 …

Redis学习(五)优惠券秒杀2——分布式锁

Redis学习&#xff08;五&#xff09;优惠券秒杀2 一、分布式锁-redission二、快速入门三、redission可重入锁原理四、redission锁的MutiLock原理 一、分布式锁-redission 基于setnx实现的分布式锁存在下面的问题&#xff1a; 重入问题&#xff1a;重入问题是指 获得锁的线程…

Flink调优----资源配置调优与状态及Checkpoint调优

目录 第 1 章 资源配置调优 1.1 内存设置 1.1.1 TaskManager 内存模型 1、内存模型详解 2、案例分析 1.1.2 生产资源配置示例 1.2 合理利用 cpu 资源 1.2.1 使用 DefaultResourceCalculator 策略 1.2.2 使用 DominantResourceCalculator 策略 1.2.3 使用 DominantRes…

Docker怎么关闭容器开机自启,批量好几个容器一起操作?

环境&#xff1a; WSL2 docker v25 问题描述&#xff1a; Docker怎么关闭容器开机自启&#xff0c;批量好几个容器一起操作&#xff1f; 解决方案&#xff1a; 在 Docker 中&#xff0c;您可以使用多种方法来关闭容器并配置它们是否在系统启动时自动启动。以下是具体步骤和…

模型的量化(Quantization)

文章目录 一、浮点数格式&#xff1a;FP64, FP32, FP16, BFLOAT16, TF32之间的相互区别1、关于浮点数2、常见的浮点数格式 二、量化&#xff08;Quantization&#xff09;1、基本概念2、量化的实现8bit量化4bit量化 三、QLora四、大语言模型量化方法对比&#xff1a;GPTQ、GGUF…

勤云远程稿件处理系统 SQL注入漏洞复现(XVE-2024-18393)

0x01 产品简介 勤云远程稿件处理系统(又称勤云采编系统)是北京勤云科技发展有限公司研发的一款产品,是一款全网络版期刊采编管理系统,旨在解决从投稿到稿件发表整个过程的信息化管理问题。该系统集成了搜索引擎、云计算等先进技术,为编辑部、作者和审稿人提供了便捷、高效…

谷歌Gemini与Anthropic Claude对比测试引发争议:AI竞赛暗流涌动

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

vLLM (2) - 架构总览

系列文章目录 vLLM (1) - Qwen2推理&部署 vLLM (2) - 架构总览 vLLM (3) - Sequence & SequenceGroup vLLM (4) - LLMEngine上篇 vLLM (5) - LLMEngine下篇 vLLM (6) - Scheduler & BlockSpaceManager 文章目录 系列文章目录前言一、官方资料二、原理简述三、架构…

QT从入门到精通(三)——实现文件列表遍历的图像浏览器

使用 Qt 实现文件列表遍历的图像浏览器 在本篇博客中将介绍如何使用 Qt 框架创建一个简单的图像浏览器应用程序。该应用程序能够选择文件夹&#xff0c;遍历其中的图像文件&#xff0c;并显示这些图像。我们将重点关注如何使用 Qt 的文件对话框和 OpenCV 库来处理图像。 1. 项…

强化特种作业管理,筑牢安全生产防线

在各类生产经营活动中&#xff0c;特种作业由于其操作的特殊性和高风险性&#xff0c;一直是安全生产管理的重点领域。有效的特种作业管理体系涵盖多个关键方面&#xff0c;从作业人员的资质把控到安全设施的配备维护&#xff0c;再到特种设备的精细管理以及作业流程的严格规范…

数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览(20241223)

数据库管理274期 2024-12-23 数据库管理-第274期 Oracle Enterprise Manager 24ai新特性一览&#xff08;20241223&#xff09;1 增强的企业管理联邦2 新的导航菜单3 EM仪表盘增强4 使用远程代理进行监控5 0停机监控6 新的作业系统控制台7 Oracle Key Vault支持8 自治数据库的引…

将Minio设置为Django的默认Storage(django-storages)

这里写自定义目录标题 前置说明静态文件收集静态文件 使用django-storages来使Django集成Minio安装依赖settings.py测试收集静态文件测试媒体文件 前置说明 静态文件 Django默认的Storage是本地&#xff0c;项目中的CSS、图片、JS都是静态文件。一般会将静态文件放到一个单独…

嵌入式单片机中蓝牙模块的详解

蓝牙模块的使用 蓝牙模块的特点可以看到蓝牙模块采用的TI公司设计的CC2541芯片,主要面向低功耗蓝牙通信方案,该模块的工作频段为2.4GHz,这个频段属于国际通用频段。 注意:蓝牙集成了一个状态指示灯,LED灯如果均匀慢速闪烁,就表示蓝牙未连接,如果LED灯常亮,表示蓝牙已连接…

互联网视频云平台EasyDSS无人机推流直播技术如何助力野生动植物保护工作?

在当今社会&#xff0c;随着科技的飞速发展&#xff0c;无人机技术已经广泛应用于各个领域&#xff0c;为我们的生活带来了诸多便利。而在动植物保护工作中&#xff0c;无人机的应用更是为这一领域注入了新的活力。EasyDSS&#xff0c;作为一款集视频处理、分发、存储于一体的综…

VMware虚拟机超详细安装Linux教程(最新版)

文章目录 前言一、下载二、安装VMware三、安装Linux&#xff08;操作系统&#xff09; 前言 VMware虚拟机的简单介绍&#xff1a; VMware虚拟机是一种功能强大且灵活的虚拟化解决方案&#xff0c;可以在Windows和Mac操作系统上运行。使用VMware虚拟机&#xff0c;可以在一个物…

YOLO原理讲解

一、YOLO的输入参数介绍 打标签后会生成一系列参数&#xff0c;包含&#xff1a; 置信度、预测框的位置&#xff08;中心点的位置、高度宽度&#xff09;、类别&#xff08;标签1、标签2、标签3......&#xff09; 二、处理图像和标签 首先YOLO会把图像均分为19*19个格子 &a…

【R语言遥感技术】“R+遥感”的水环境综合评价方法

R语言在遥感领域中是一个强大的工具&#xff0c;它提供了一系列的功能和优势&#xff0c;使得遥感数据的分析和应用更加高效和灵活。以下是R语言在遥感中的具体应用&#xff1a; 数据处理&#xff1a;R语言可以处理和清洗遥感数据&#xff0c;包括数据转换、滤波处理、去噪和数…

最新的强大的文生视频模型Pyramid Flow 论文阅读及复现

《PYRAMIDAL FLOW MATCHING FOR EFFICIENT VIDEO GENERATIVE MODELING》 论文地址&#xff1a;2410.05954https://arxiv.org/pdf/2410.05954 项目地址&#xff1a; jy0205/Pyramid-Flow&#xff1a; 用于高效视频生成建模的金字塔流匹配代码https://github.com/jy0205/Pyram…