You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure AD B2C:邮件邀请员工注册的Node.js实现及联动咨询

解决方案:Azure B2C邀请注册流程 + Node.js后端实现

一、完整用户旅程协同逻辑

  • 管理员在React前端提交邀请邮箱,调用Node后端接口
  • Node后端生成加密的邀请令牌(包含受邀邮箱、组织ID、过期时间),构造指向Azure B2C自定义注册页的链接
  • 后端通过邮件服务发送邀请链接给目标邮箱
  • 员工点击链接后,跳转至Azure B2C自定义注册流程,B2C解析并验证邀请令牌
  • B2C强制员工使用受邀邮箱注册本地账号,或关联与受邀邮箱匹配的Google账号完成注册
  • 注册完成后,B2C可触发后端API同步用户信息到业务系统

二、Node.js后端核心实现步骤

1. 依赖安装

npm install jsonwebtoken nodemailer @azure/keyvault-secrets @azure/identity

(注:用Azure Key Vault存储JWT密钥和邮件配置,避免硬编码敏感信息)

2. 生成加密邀请令牌

用JWT生成包含邀请信息的令牌,确保只有合法邀请才能进入注册流程:

const jwt = require('jsonwebtoken');
const { SecretClient } = require('@azure/keyvault-secrets');
const { DefaultAzureCredential } = require('@azure/identity');

// 从Key Vault获取JWT签名密钥
async function getJwtSecret() {
  const credential = new DefaultAzureCredential();
  const client = new SecretClient('https://<你的Key Vault名称>.vault.azure.net/', credential);
  const secret = await client.getSecret('invite-jwt-secret');
  return secret.value;
}

// 生成邀请令牌
async function generateInviteToken(invitedEmail, tenantId, organizationId) {
  const secret = await getJwtSecret();
  return jwt.sign(
    {
      email: invitedEmail,
      orgId: organizationId,
      exp: Math.floor(Date.now() / 1000) + 7 * 24 * 60 * 60, // 7天过期
      iss: `https://${tenantId}.onmicrosoft.com/your-api` // 签发者标识,用于B2C验证
    },
    secret,
    { algorithm: 'HS256' }
  );
}

3. 构造Azure B2C注册链接

将邀请令牌作为参数拼接到B2C自定义注册策略的URL中:

function buildB2CInviteLink(token, tenantId, policyId, clientId, redirectUri) {
  return `https://${tenantId}.b2clogin.com/${tenantId}.onmicrosoft.com/${policyId}/oauth2/v2.0/authorize?` +
    `client_id=${clientId}` +
    `&response_type=code` +
    `&redirect_uri=${encodeURIComponent(redirectUri)}` +
    `&scope=openid%20offline_access%20${clientId}` +
    `&state=invite_flow` +
    `&invite_token=${encodeURIComponent(token)}`;
}

(参数说明:policyId是你的自定义注册策略ID,clientId是React应用的B2C应用ID,redirectUri是注册完成后跳转回前端的地址)

4. 发送邀请邮件

用Nodemailer实现邮件发送(也可替换为Azure SendGrid):

const nodemailer = require('nodemailer');

async function sendInviteEmail(toEmail, inviteLink) {
  // 从Key Vault获取SMTP配置
  const credential = new DefaultAzureCredential();
  const client = new SecretClient('https://<你的Key Vault名称>.vault.azure.net/', credential);
  const smtpUser = await client.getSecret('smtp-username');
  const smtpPass = await client.getSecret('smtp-password');

  const transporter = nodemailer.createTransport({
    host: 'smtp.office365.com',
    port: 587,
    secure: false,
    auth: {
      user: smtpUser.value,
      pass: smtpPass.value
    }
  });

  const mailOptions = {
    from: '你的组织邮箱 <no-reply@your-org.com>',
    to: toEmail,
    subject: '邀请你加入XX组织',
    html: `<p>点击下方链接完成注册:</p><a href="${inviteLink}">注册链接</a><p>链接7天内有效</p>`
  };

  return transporter.sendMail(mailOptions);
}

5. 整合前端调用接口

暴露API接口供React前端触发邀请流程:

const express = require('express');
const app = express();
app.use(express.json());

app.post('/api/invite-staff', async (req, res) => {
  try {
    const { invitedEmail, organizationId } = req.body;
    const tenantId = '你的B2C租户ID';
    const policyId = 'B2C_1A_Invite_Signup'; // 自定义注册策略ID
    const clientId = 'React应用的B2C应用ID';
    const redirectUri = 'https://your-react-app.com/invite-complete';

    // 生成令牌和邀请链接
    const token = await generateInviteToken(invitedEmail, tenantId, organizationId);
    const inviteLink = buildB2CInviteLink(token, tenantId, policyId, clientId, redirectUri);

    // 发送邮件
    await sendInviteEmail(invitedEmail, inviteLink);

    res.status(200).json({ message: '邀请邮件已发送' });
  } catch (error) {
    console.error('发送邀请失败:', error);
    res.status(500).json({ error: '发送邀请失败' });
  }
});

app.listen(3000, () => console.log('后端服务运行在3000端口'));

三、Azure B2C自定义策略协同要点

  1. 添加邀请相关声明:在策略的<ClaimsSchema>中添加invite_token和invited_email声明,用于存储解析后的邀请信息
  2. 验证邀请令牌:添加REST API技术步骤,调用后端接口(或直接用B2C的JWT验证技术)解析令牌,验证签名、过期时间和邮箱合法性
  3. 限制注册方式:
    • 本地账号注册:强制signInName等于invited_email,隐藏邮箱输入框或设置为不可编辑
    • Google OAuth注册:添加验证步骤,检查Google返回的email与invited_email一致,否则拒绝注册
  4. 同步用户信息:注册完成后,添加REST API技术步骤,将新用户的ID、邮箱、组织ID同步到你的后端业务系统

四、关键安全注意事项

  • JWT签名密钥必须存储在Azure Key Vault,禁止硬编码在代码或配置文件中
  • 邀请令牌设置合理过期时间(建议7天),避免长期有效
  • B2C注册链接使用HTTPS,防止中间人攻击
  • 后端邀请接口添加管理员身份验证(如JWT验证),确保只有授权管理员能发送邀请

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:40:14