You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

JS客户端与Azure后端服务的安全认证方案咨询——避免客户端存储密钥

安全实现JS客户端与Node后端的认证交互方案

你的核心痛点是要在不暴露敏感凭证(比如client_secret)的前提下,确保只有指定的JS客户端能访问你的Node后端,同时后端安全地和Azure服务交互。下面是几个经过实践验证的思路,按优先级和安全性排序:

1. 采用OAuth 2.0授权码流 + PKCE(SPA应用的标准安全方案)

这是目前针对SPA应用最安全的认证流程,完全不需要在前端存储任何敏感信息,从根源上解决了client_secret暴露的问题:

  • 流程步骤:
    1. 前端(你的JS客户端)引导用户跳转到Azure AD的授权登录页面,同时生成一个随机的code_verifier和对应的code_challenge,把code_challenge传给Azure AD。
    2. 用户完成登录后,Azure AD返回一个授权码给前端。
    3. 前端将这个授权码发送到你的Node后端。
    4. 后端使用自己存储的client_idclient_secret,加上前端传来的授权码,向Azure AD请求交换access_tokenrefresh_token
    5. 后端拿到Azure的token后,就可以安全调用Azure管理API,再把处理后的结果返回给前端。
  • 关键优势:PKCE机制会确保只有生成code_challenge的前端才能用授权码换token,即使授权码被劫持也无法滥用;全程前端不需要接触任何敏感凭证。
  • 工具推荐:前端用@azure/msal-browser库处理授权流程,后端用@azure/msal-node或者passport-azure-ad来完成token交换和验证。

2. 给Node后端添加Azure AD API认证,限制客户端访问

把你的Node后端注册为Azure AD中的一个受保护API,同时给你的SPA客户端分配访问该API的权限:

  • 操作步骤:
    1. 在Azure AD中注册后端API,定义专属的访问范围(比如api://your-backend-id/access_as_user)。
    2. 给你的SPA客户端应用分配访问这个后端API的权限。
    3. 前端通过授权码流获取访问后端API的token(而不是直接获取Azure管理API的token)。
    4. 后端收到请求时,校验这个token的有效性:检查token的aud(受众)是否是后端API的client_id,以及scp(范围)是否包含你定义的权限。
  • 好处:只有经过Azure AD认证的你的SPA客户端,才能拿到访问后端的合法token,后端无需额外维护其他密钥,只需验证Azure签发的token即可。

3. 辅助验证:限制请求来源(仅作为补充,不能单独依赖)

可以在Node后端添加请求来源校验,只允许你的SPA域名的请求:

  • 示例代码(Express框架):
    app.use((req, res, next) => {
      const allowedOrigins = ['https://your-spa-domain.com']; // 替换成你的SPA域名
      const origin = req.headers.origin;
      if (allowedOrigins.includes(origin)) {
        res.setHeader('Access-Control-Allow-Origin', origin);
      } else {
        return res.status(403).send('Forbidden: Invalid request origin');
      }
      next();
    });
    
  • 注意:这种方式只能作为辅助安全措施,因为OriginReferer头可以被伪造,必须配合前面的OAuth认证流程一起使用。

4. 立即停用密码授权流(Password Grant)

你原来代码中使用的password授权类型是极不安全的:前端需要收集用户的用户名和密码,很容易在传输或存储过程中被窃取,而且Azure AD已经不再推荐这种方式用于SPA应用。一定要替换成前面提到的授权码流+PKCE方案。


内容的提问来源于stack exchange,提问作者Segfault

火山引擎 最新活动