Azure B2C 与 PHP 应用(Slim 框架)的完整集成指南

Azure B2C 与 PHP 应用(Slim 框架)的完整集成指南

本文详细讲解如何在基于 php(特别是 slim 框架)的客户门户中集成 azure ad b2c,实现安全、可扩展的用户认证,并支持与 microsoft dynamics ce 的后续对接。

将 Azure AD B2C 集成到 PHP 技术(尤其是轻量级框架如 Slim)是完全可行的生产级方案,但需注意:官方示例主要基于原生 PHP + OpenID Connect(OIDC)实现,而非直接提供 Slim 专用 SDK。因此,集成核心在于正确实现 OIDC 协议流程,而非依赖框架绑定库。

✅ 推荐实施路径(适配 Slim)

  1. 环境准备
    确保 PHP ≥ 7.4(推荐 8.1+),启用 curljson、openssl 扩展。Slim v4 或 v5 均可兼容,无需 Laravel —— 示例仓库中的逻辑可完全解耦复用。

  2. Azure 侧配置

    ECTouch移动商城系统

    ECTouch移动商城系统

    ECTouch是上海商创网络科技有限公司推出的一套基于 PHP 和 MySQL 数据库构建的开源且易于使用的移动商城网店系统!应用于各种服务器平台的高效、快速和易于管理的网店解决方案,采用稳定的MVC框架开发,完美对接ecshop系统与模板堂众多模板,为中小企业提供最佳的移动电商解决方案。ECTouch程序源代码完全无加密。安装时只需将已集成的文件夹放进指定位置,通过浏览器访问一键安装,无需对已有

    下载

    • Azure Portal → B2C Tenant 中注册 Web 应用,设置重定向 URI 为 https://your-domain.com/callback(需与 Slim 路由一致)。
    • 记录以下关键参数:
      AZURE_TENANT_ID=your-tenant-name.onmicrosoft.com
      AZURE_CLIENT_ID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
      AZURE_CLIENT_SECRET=your-client-secret
      POLICY_SIGNINUP=B2C_1_signupsignin
  3. OIDC 认证流程(Slim 中实现示例)
    使用 league/oauth2-client(推荐)或原生 cURL 实现授权码流。以下为 Slim v4 路由精简示例:

    // routes.php
    use Psr/Http/Message/ResponseInterface as Response;
    use Psr/Http/Message/ServerRequestInterface as Request;
    
    $app->get('/login', function (Request $request, Response $response) {
        $authUrl = sprintf(
            'https://%s.b2clogin.com/%s/oauth2/v2.0/authorize?' .
            'client_id=%s&redirect_uri=%s&response_type=code&scope=openid&' .
            'response_mode=query&prompt=login&nonce=%s&state=%s&' .
            'p=%s',
            $_ENV['AZURE_TENANT_ID'],
            $_ENV['AZURE_TENANT_ID'],
            $_ENV['AZURE_CLIENT_ID'],
            urlencode('https://' . $_SERVER['HTTP_HOST'] . '/callback'),
            bin2hex(random_bytes(16)),
            bin2hex(random_bytes(16)),
            $_ENV['POLICY_SIGNINUP']
        );
        return $response->withStatus(302)->withHeader('Location', $authUrl);
    });
    
    $app->get('/callback', function (Request $request, Response $response) {
        $code = $request->getQueryParam('code');
        $state = $request->getQueryParam('state');
    
        // 1. 用 code 换取 ID Token(需 POST 到 token endpoint)
        $tokenUrl = sprintf(
            'https://%s.b2clogin.com/%s/oauth2/v2.0/token?p=%s',
            $_ENV['AZURE_TENANT_ID'],
            $_ENV['AZURE_TENANT_ID'],
            $_ENV['POLICY_SIGNINUP']
        );
    
        $ch = curl_init($tokenUrl);
        curl_setopt_array($ch, [
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => http_build_query([
                'grant_type' => 'authorization_code',
                'client_id' => $_ENV['AZURE_CLIENT_ID'],
                'client_secret' => $_ENV['AZURE_CLIENT_SECRET'],
                'code' => $code,
                'redirect_uri' => 'https://' . $_SERVER['HTTP_HOST'] . '/callback',
                'scope' => 'openid'
            ])
        ]);
        $resp = json_decode(curl_exec($ch), true);
        curl_close($ch);
    
        if (!empty($resp['id_token'])) {
            // 2. 校验 ID Token 签名 & claims(关键!)
            // 使用 firebase/php-jwt 或 web-token/jwt-framework 验证 signature 和 issuer/audience/exp
            $token = /Firebase/JWT/JWT::decode($resp['id_token'], $jwks, ['RS256']);
            $_SESSION['user'] = (array) $token;
            return $response->withStatus(302)->withHeader('Location', '/dashboard');
        }
    
        return $response->withStatus(401)->write('Login failed');
    });

⚠️ 关键注意事项

  • Token 验证不可省略:必须通过 Azure B2C 的 JWKS 端点(https://.b2clogin.com/.onmicrosoft.com/discovery/v2.0/keys?p=)获取公钥并验证签名,防止伪造 token。
  • 策略(Policy)即流程:每个用户旅程(如注册、密码重置)对应独立策略 ID(如 B2C_1_passwordreset),需在请求中显式指定 p= 参数。
  • Slim 无状态适配:确保 session_start() 正确启用,或使用 Redis 存储 session 以支持横向扩展。
  • Dynamics CE 对接前提:B2C 用户对象需通过 Graph API 或自定义策略同步至 Azure AD(via B2C → AAD federation),才能被 Dynamics CE 识别;此步需额外配置 Identity Provider 联合。

✅ 总结

Azure B2C 与 PHP/Slim 的集成本质是标准 OIDC 实现,不依赖框架深度耦合。推荐从 Azure 官方 PHP OIDC 示例出发,提取核心鉴权逻辑,再按 Slim 路由风格重构。只要严格遵循 token 获取、验证、会话管理三步,即可构建高可用、合规的客户门户认证体系,并为后续 Dynamics CE 集成奠定坚实基础。

https://www.php.cn/faq/2007368.html

发表回复

Your email address will not be published. Required fields are marked *