Spring Authorization Server (如何使用具有 PKCE 的单页应用程序进行身份验证-2)

使用 Spring Authorization Server 实现具有 PKCE 的单页应用程序进行身份验证

开启 CORS

SPA 由静态资源组成,可以通过多种方式进行部署。它可以与后端分开部署,例如使用 CDN 或单独的 Web 服务器,也可以使用 Spring Boot 与后端一起部署。

当 SPA 托管在不同的域下时,可以使用跨域资源共享 (CORS) 来允许应用程序与后端通信。

例如,如果你有一个在端口 4200 上本地运行的 Angular 开发服务器,你可以定义一个 CorsConfigurationSource @Bean并将 Spring Security 配置为允许使用 cors() DSL 的预检请求,如以下示例所示:

Enable CORS

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.http.MediaType;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
import org.springframework.security.web.util.matcher.MediaTypeRequestMatcher;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;@Configuration
@EnableWebSecurity
public class SecurityConfig {@Bean@Order(1)public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http)throws Exception {OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());	// Enable OpenID Connect 1.0http// Redirect to the login page when not authenticated from the// authorization endpoint.exceptionHandling((exceptions) -> exceptions.defaultAuthenticationEntryPointFor(new LoginUrlAuthenticationEntryPoint("/login"),new MediaTypeRequestMatcher(MediaType.TEXT_HTML)))// Accept access tokens for User Info and/or Client Registration.oauth2ResourceServer((oauth2) -> oauth2.jwt(Customizer.withDefaults()));return http.cors(Customizer.withDefaults()).build();}@Bean@Order(2)public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http)throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated())// Form login handles the redirect to the login page from the// authorization server filter chain.formLogin(Customizer.withDefaults());return http.cors(Customizer.withDefaults()).build();}@Beanpublic CorsConfigurationSource corsConfigurationSource() {UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();CorsConfiguration config = new CorsConfiguration();config.addAllowedHeader("*");config.addAllowedMethod("*");config.addAllowedOrigin("http://127.0.0.1:4200");config.setAllowCredentials(true);source.registerCorsConfiguration("/**", config);return source;}}

配置一个公共客户端

SPA 无法安全地存储凭据,因此必须将其视为公共客户端。应要求公共客户端使用代码交换证明密钥 (PKCE)。

继续前面的示例,您可以将 Spring Authorization Server 配置为使用客户端身份验证方法 none 并需要 PKCE 来支持公共客户端,如以下示例所示:

spring:security:oauth2:authorizationserver:client:public-client:registration:client-id: "public-client"client-authentication-methods:- "none"authorization-grant-types:- "authorization_code"redirect-uris:- "http://127.0.0.1:4200"scopes:- "openid"- "profile"require-authorization-consent: truerequire-proof-key: true

注意:
requireProofKey 设置在忘记包含 code_challenge 和 code_challenge_method 查询参数的情况下非常有用,因为您将收到一个错误,指示在授权请求期间需要 PKCE,而不是在令牌请求期间出现常规客户端身份验证错误。

对客户端进行身份验证

将服务器配置为支持公共客户端后,一个常见问题是:如何对客户端进行身份验证并获取访问令牌?简短的回答是:与任何其他客户一样。

SPA 是基于浏览器的应用程序,因此使用与任何其他客户端相同的基于重定向的流程。此问题通常与可以通过 REST API 执行身份验证的期望有关,而 OAuth2 并非如此。
更详细的答案需要了解 OAuth2 和 OpenID Connect 中涉及的流程,在本例中为授权代码流程。授权代码流的步骤如下:

  • 客户端通过重定向到授权终结点来启动 OAuth2 请求。对于公共客户端,此步骤包括生成code_verifier和计算code_challenge,然后将其作为查询参数发送。

  • 如果用户未通过身份验证,授权服务器将重定向到登录页面。身份验证后,用户将再次重定向回授权终结点。

  • 如果用户尚未同意请求的范围,并且需要同意,则会显示同意页面。

  • 一旦用户同意,授权服务器就会生成一个authorization_code,并通过redirect_uri重定向回客户端。

  • 客户端通过查询参数获取authorization_code,并向令牌终结点执行请求。对于公共客户端,此步骤包括发送 code_verifier 参数而不是用于身份验证的凭据。

正如你所看到的,流程是相当复杂的,这只是一个概述。

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

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

相关文章

Practical User Research for Enterprise UX

2.1 Why It’s Hard to Get Support for Research in Enterprises 2.1.1 Time and Budget Instead of answering the question “What dowe gain if we do this research?”, ask instead “What do we stand to lose if we don’t do the research?” 2.1.2 Legacy Thinkin…

鸿蒙会成为安卓的终结者吗?

随着近期鸿蒙OS系统推送测试版的时间确定,关于鸿蒙系统的讨论再次升温。 作为华为自主研发的操作系统,鸿蒙给人的第一印象是具有颠覆性。 早在几年前,业内就开始流传鸿蒙可能会代替Android的传言。毕竟,Android作为开源系统&…

python中websockets与主线程传递参数

目录 一、子线程创建websockets服务端接收客户端数据 二、主线程内启动子线程接收并处理数据 一、子线程创建websockets服务端接收客户端数据并存入队列 发送的消息客户端与服务端统一,多种消息加入判断的标签 服务端:web_server.py import asynci…

迷你世界彩色建筑生成

local x0,y0,z00,20,0--起点坐标 local dx,dy,dz100,100,1--外切长方体横纵竖长度 local count,all0,dx*dy*dz--计数,总数 local m,k10000,0--单次生成方块数,无用循环值 local x,y,z0,0,0--当前坐标 local id600--方块id local demath.random(2,12)/2 -…

如何使用idea连接服务器上的mysql?

安全组进行开放 具体步骤 关闭防火墙 开放端口号 重启防火墙 firewall-cmd --reload在mysql进行修改配置 update user set host % where user root;flush privileges;使得其他网络也可以连接这个数据库 另外如果想要sqlyog或者其他图形化界面要连接到数据库可以看下面这…

创建无名信号量

#include<myhead.h> //创建无名信号量 sem_t sem;//定义生产者 void *task1(void *arg) {int num5;while(num--){sleep(1);printf("我生产了一辆特斯拉\n");//释放资源sem_post(&sem);}//退出线程pthread_exit(NULL); } //定义消费者 void *task2(void *ar…

Android Debug Bridge (ADB) v1.0.31

Android Debug Bridge [ADB] v1.0.31 References Android SDK Platform Tools for Windows, Linux, Mac (all versions) https://developer.android.google.cn/studio/releases/platform-tools Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。保…

Python: argparse基本用法

Python: argparse基本用法 &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;【Matplotlib之旅&#xff1a;零基础精通数据可视化】 &#x1f4a1; 创作高质量博文&#xff0c;分享更多关于深度学习、PyTorch、Python领域的优质内容&#xff0…

Flink介绍

Flink 介绍 文章目录 Flink 介绍1. 简介1.1 背景1.2 用途 2. 核心概念2.1 流&#xff08;Stream&#xff09;2.2 转换&#xff08;Transformation&#xff09;2.3 窗口&#xff08;Window&#xff09;2.4 状态&#xff08;State&#xff09; 3. 编程模型3.1 编程模型介绍3.2 程…

排序算法1:冒泡排序、快速排序、插入排序

排序算法&#xff1a;交换类排序&#xff0c;插入类排序、选择类排序、归并类排序 交换类排序&#xff1a;冒泡排序、快速排序 一、冒泡排序 #include <stdio.h> #include <stdlib.h> #include <time.h> typedef int ElemType; typedef struct{ElemType *e…

【Java EE初阶二十二】https的简单理解

1. 初识https 当前网络上,主要都是 HTTPS 了,很少能见到 HTTP.实际上 HTTPS 也是基于 HTTP.只不过 HTTPS 在 HTTP 的基础之上, 引入了"加密"机制&#xff1b;引入 HTTPS 防止你的数据被黑客篡改 &#xff1b; HTTPS 就是一个重要的保护措施.之所以能够安全, 最关键的…

第2.5章:StarRocks表设计--Colocation Join

目录 一、StarRocks数据划分 1.1 分区 1.2 分桶 二、Colocation Join实现原理 2.1 Colocate Join概述 2.2 Colocate Join实现原理 三、应用案例 注&#xff1a;本篇文章阐述的是StarRocks-3.2版本的Colocation Join 官网文章地址&#xff1a; Colocate Join | StarRoc…

css知识:盒模型盒子塌陷BFC

1. css盒模型 标准盒子模型&#xff0c;content-box 设置宽度即content的宽度 width content 总宽度content&#xff08;width设定值&#xff09; padding border IE/怪异盒子模型&#xff0c;border-box width content border padding 总宽度 width设定值 2. 如何…

互联网加竞赛 大数据疫情分析及可视化系统

文章目录 0 前言2 开发简介3 数据集4 实现技术4.1 系统架构4.2 开发环境4.3 疫情地图4.3.1 填充图(Choropleth maps)4.3.2 气泡图 4.4 全国疫情实时追踪4.6 其他页面 5 关键代码最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 大数据疫…

oppo手机如何录屏?解锁录屏新功能!

“最近换了一款oppo手机&#xff0c;感觉它的拍照功能真的很强大。但除此之外&#xff0c;我发现oppo还有许多隐藏功能&#xff0c;比如录屏。但我尝试了很久&#xff0c;都没找到录屏的开关在哪里。有没有哪位oppo用户知道怎么打开这个功能呢&#xff1f;” 随着科技的不断发…

Nexus 仓库

一、仓库介绍 1.仓库类型 proxy&#xff1a;是远程仓库的代理。比如说在nexus中配置了一个central repository的proxy&#xff0c;当用户向这个proxy请求一个artifact&#xff0c;这个proxy就会先在本地查找&#xff0c;如果找不到的话&#xff0c;就会从远程仓库下载&#x…

科创板,北证,创业板,主板,沪港通 的交易规则

以下是科创板、北交所&#xff08;即北京证券交易所&#xff09;、创业板、主板以及沪港通的主要交易规则概述&#xff0c;具体细节可能会随时间调整&#xff0c;请以最新官方规定为准&#xff1a; 1. **科创板** - 开户条件&#xff1a;投资者需有2年以上证券交易经验&…

WPF中DataGrid垂直滚动条滚动后行号错乱的解决办法

原因 DataGrid 的 EnableRowVirtualization 属性默认值是True&#xff0c;就是说动态加载数据&#xff0c;只实例化屏幕内可见的数据&#xff1b;行头的内容是通过绑定实现的&#xff0c;但是滚动刷新时传入的DataGridRow并不是实际位置的行&#xff0c;而是虚拟的&#xff0c;…

小迪安全29WEB 攻防-通用漏洞SQL 注入增删改查盲注延时布尔报错

#知识点&#xff1a; 1、明确查询方式注入 Payload 2、明确查询方式注入产生功能 3、明确 SQL 盲注延时&布尔&报错 #详细点&#xff1a; 盲注就是在注入过程中&#xff0c;获取的数据不能回显至前端页面。 也就是在代码中无echo将sql结果输出出来 此时&#…

详解 IT/OT 融合的五层架构(从PLC/SCADA到MES/ERP)

作为一个电气自动化的从业者&#xff0c;有必要搞懂下面术语的意思。 IT&#xff1a;Information Technology的缩写&#xff0c;指信息技术&#xff1b; OT&#xff1a;Operational Technology的缩写&#xff0c;指操作层面的技术&#xff0c;比如运营技术&#xff1b;CT&…