JS如何与SpringOAuth2安全认证配合_JS与SpringOAuth2安全认证配合的教程


前端通过OAuth2授权码模式+PKCE跳转登录,获取access_token后在请求头携带Bearer Token访问受Spring Security保护的API,后端配置JWT资源服务器验证令牌并启用CORS支持跨域。

js如何与springoauth2安全认证配合_js与springoauth2安全认证配合的教程

J*aScript前端应用与Spring Boot后端集成OAuth2安全认证,是现代全栈开发中的常见需求。通常前端使用JS(如Vue、React或原生JS)发起请求,后端使用Spring Security + OAuth2进行权限控制。下面介绍如何让JS与Spring OAuth2协同工作,实现安全的用户登录和资源访问。

理解整体架构

在典型的前后端分离项目中:

  • 前端(JS)运行在浏览器中,负责展示界面并与用户交互
  • 后端(Spring Boot)暴露REST API,通过Spring Security和OAuth2保护接口
  • 认证服务器负责颁发token(可以是独立服务,也可以内嵌在Spring应用中)

常见的流程是:用户在前端点击“登录”,跳转到OAuth2授权服务器(如Google、GitHub或自建),授权后获取access_token,后续请求携带该token访问受保护的API。

配置Spring Boot OAuth2资源服务器

确保你的Spring Boot应用正确配置为OAuth2资源服务器,能验证JWT格式的access token。

application.yml 示例:
spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:8080/auth/realms/your-realm
          # 或者指定 jwk-set-uri

添加依赖(M*en):

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

启用Security配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http.authorizeHttpRequests(authz ->
            authz.requestMatchers("/public/**").permitAll()
                  .anyRequest().authenticated()
        );
        http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
        return http.build();
    }
}

前端JS如何处理OAuth2登录与请求

由于浏览器安全限制,不推荐在JS中直接处理client_secret等敏感信息。应采用授权码模式 + PKCE,适合单页应用(SPA)。

LALAL.AI LALAL.AI

AI人声去除器和声乐提取工具

LALAL.AI 196 查看详情 LALAL.AI

使用官方推荐库如 openid-client 或更轻量的 simple-oauth2,但更推荐使用 Auth.js(原NextAuth)或 OAuth2-Client 库简化流程。

一个简单的JS登录跳转示例:

function login() {
  const clientId = 'your-spa-client-id';
  const redirectUri = 'https://www.php.cn/link/c7e07c312fd6bafc9f5192b3dfdf3d3f';
  const scope = 'openid profile email';
  const state = generateRandomString();
  const codeVerifier = generateCodeVerifier(); // PKCE用
  const codeChallenge = base64UrlEncode(sha256(codeVerifier));
<p>// 存储codeVerifier以便回调时使用
sessionStorage.setItem('code_verifier', codeVerifier);</p><p>const authUrl = new URL('<a href="https://www.php.cn/link/90918c5b8c17f80e32d5b155a7bf6197">https://www.php.cn/link/90918c5b8c17f80e32d5b155a7bf6197</a>');
authUrl.searchParams.append('client_id', clientId);
authUrl.searchParams.append('response_type', 'code');
authUrl.searchParams.append('scope', scope);
authUrl.searchParams.append('redirect_uri', redirectUri);
authUrl.searchParams.append('state', state);
authUrl.searchParams.append('code_challenge', codeChallenge);
authUrl.searchParams.append('code_challenge_method', 'S256');</p><p>window.location.href = authUrl.toString();
}

回调页面(callback.html)处理授权码并换取token:

// 假设URL中包含 ?code=xxx&state=yyy
const urlParams = new URLSearchParams(window.location.search);
const code = urlParams.get('code');
<p>if (code) {
const codeVerifier = sessionStorage.getItem('code_verifier');
fetch('<a href="https://www.php.cn/link/d996e31032e7c288d7e20e7b82221c20">https://www.php.cn/link/d996e31032e7c288d7e20e7b82221c20</a>', {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: new URLSearchParams({
grant_type: 'authorization_code',
client_id: 'your-spa-client-id',
code: code,
redirect_uri: '<a href="https://www.php.cn/link/c7e07c312fd6bafc9f5192b3dfdf3d3f">https://www.php.cn/link/c7e07c312fd6bafc9f5192b3dfdf3d3f</a>',
code_verifier: codeVerifier
})
})
.then(response => response.json())
.then(data => {
localStorage.setItem('access_token', data.access_token);
window.location.href = '/dashboard.html';
});
}

JS发起受保护的API请求

每次调用Spring保护的接口时,在请求头中带上access token:

fetch('http://localhost:8080/api/user/profile', {
  method: 'GET',
  headers: {
    'Authorization': 'Bearer ' + localStorage.getItem('access_token')
  }
})
.then(response => {
  if (response.status === 401) {
    // token过期,重新登录
    window.location.href = '/login.html';
  }
  return response.json();
})
.then(data => console.log(data));

建议封装一个API客户端,自动附加token:

function apiGet(url) {
  return fetch(url, {
    headers: {
      'Authorization': 'Bearer ' + localStorage.getItem('access_token')
    }
  });
}

基本上就这些。只要前后端约定好token传递方式,Spring会自动解析JWT并建立安全上下文。注意跨域问题需在后端配置CORS,允许前端域名访问。

以上就是JS如何与SpringOAuth2安全认证配合_JS与SpringOAuth2安全认证配合的教程的详细内容,更多请关注其它相关文章!


# 令牌  # SEO优化软件分类英语  # 优米网站建设  # 官方网站建设作用  # 巩义搜狗网站建设多少钱  # 利川网站建设公司  # 安徽关键词排名电话  # yun_seo  # 营销技巧及产品推广培训  # 自助网站建设与制作论文  # 丹东关键词排名优化费用  # 解决问题  # 中文网  # 相关文章  # 也可  # 推荐使用  # js开发spring教程  # 回调  # 跳转  # 后端  # 安全认证  # g  # json  # git  # 前端  # js  # html  # java  # javascript  # react  # vue 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894 】


相关推荐: PHP与SQL实践:高效实现数据复制与特定列值修改  iPhone17Pro如何连接蓝牙耳机_iPhone17Pro蓝牙设备配对与连接方法介绍  VS Code中的Tailwind CSS IntelliSense插件使用技巧  圆通快递包裹轨迹查询 圆通速递快件实时位置跟踪  《七读免费小说》开通会员方法  Lar*el 关联查询:同时筛选父表与子表数据的高效策略  房产|直播|视频号怎么认证开通?|直播|需要什么资质?  PHP安全加载非公开目录图片与动态内容类型处理指南  斯宾塞称XGP云游戏“蒸蒸日上”:正在构建一个游戏从未如此唾手可得的未来  电脑的“恢复环境(WinRE)”找不到怎么办_Windows系统恢复环境重建【高级修复】  解决PHP MySQL数据库更新无响应:SQL查询语法错误解析  AngularJS动态内容中DOM元素查找的时序问题及$timeout解决方案  解决C#跨线程访问XML对象的异常 安全的并发XML处理模式  WooCommerce 购物车:始终显示所有交叉销售商品  qq邮箱格式填写示例 qq邮箱标准填写规范  研招网官方网站招生平台入口_中国研究生招生信息网官网登录  163邮箱登录入口官网 163.com邮箱登录入口  PSD转AI文件的简单方法  百度地图离线地图无法加载如何解决 百度地图离线地图加载优化方法  Python对象引用与属性赋值:理解链表中的行为  《雅迪智行》用手机开锁方法  iSpring三分屏制作教程  C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树  睡觉时心跳快是什么原因 夜间心悸如何应对  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  HTML Canvas文本样式定制指南:解决外部字体加载与应用难题  TikTok视频播放中断怎么办 TikTok播放异常修复方法  《杖剑传说》食谱大全  《edge浏览器》关闭翻译功能方法  手机雨课堂网页版入口免登录 雨课堂网页版可点击直接进入  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  Win10锁屏时间怎么设置 Win10调整自动锁屏时间方法  Excel如何制作月度销售统计图_Excel动态图表制作与控件应用  c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化  Django模型动态关联检查:高效管理复杂关系  AO3中文入口稳定分享_AO3官网HTTPS看文详解  拷贝漫画2025网页版入口 拷贝漫画官网免费看全集  《蓝色星原:旅谣》坐骑获取攻略  苹果手机聊天记录删除了如何恢复  微信客户端怎么查看二维码_微信客户端个人二维码查看方法  《一起考教师》账号注销方法  win11自带录屏文件保存在哪里 Win11 Game Bar录制视频默认路径【分享】  《战地6》反作弊已成功拦截240万次作弊 发售第一周98%比赛没有作弊  手机自动关机是怎么回事?如何修复?手机异常关机的原因排查与修复技巧  抄漫画官网防走失地址_抄漫画最新漫画完整版阅读入口  荣耀盒子应用管理技巧  PHP utf8_encode 字符编码转换疑难解析与最佳实践  mysql数据库索引类型有哪些_mysql索引类型解析  TikTok网页版实时观看入口 TikTok网页版短视频在线浏览  火柴人战争网页版在线玩 

 2025-11-09

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.