document.writeln('');
当前位置:首页 > 云服务器

Azure B2C 与 PHP Web 应用集成完整教程

游戏科技网2026年09月14日 21:28云服务器90

本文详细介绍如何在 php(尤其是 slim 框架)项目中集成 azure ad b2c 实现安全、标准化的用户认证,涵盖注册/登录流程、openid connect 配置、token 验证及 azure 部署关键步骤。

Azure Active Directory B2C(Azure AD B2C)是面向消费者身份管理的云服务,支持自定义策略、多因素认证、社交账号登录(如 Google、Facebook),并能与 Microsoft Dynamics 365 Customer Engagement(CE)无缝对接——这使其成为企业级客户门户的理想认证后端。尽管官方示例主要基于 Laravel,但其底层依赖 OpenID Connect 协议,完全兼容任何标准 PHP 应用(包括 Slim、Lumen 或原生 PHP),无需框架强绑定。

✅ 核心集成原理

Azure AD B2C 通过 OpenID Connect(OIDC) 提供标准化的身份验证流。PHP 应用只需:

  • 重定向用户至 B2C 授权端点(https://<tenant>.b2clogin.com/<tenant>.onmicrosoft.com/<policy>/oauth2/v2.0/authorize);
  • 接收授权码(code)后,向令牌端点交换 id_token 和 access_token;
  • 使用公钥(JWKS URI)验证 id_token 签名,并解析声明(如 sub, email, name)完成登录。

?️ 实施步骤(Slim 框架适配版)

  1. Azure 门户配置

    • 在 Azure Portal → Azure AD B2C 创建租户(若未有);
    • 注册应用:选择“应用”→“新注册”,设置重定向 URI 为 https://yourdomain.com/callback(生产环境需 HTTPS);
    • 记录 Application (client) ID 和 Client secret(在“证书和密码”中生成);
    • 创建用户流(User Flow),例如 B2C_1_signupsignin,启用邮箱/用户名登录。
  2. PHP 端集成(Slim 4 示例)
    安装必要依赖:

    1

    composer require league/oauth2-client guzzlehttp/guzzle firebase/php-jwt

    在 Slim 路由中实现登录与回调逻辑:

    GitHub Token

    使用个人访问令牌与GitHub交互,安全、用户可控的访问方式,无需OAuth或完整账户权限。支持克隆、推送、分支、PR、Issue等操作。适用于需要操作GitHub仓库的场景。

    下载

    立即学习“PHP免费学习笔记(深入)”;

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    // 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 = https://<your-tenant>.b2clogin.com/<your-tenant>.onmicrosoft.com/B2C_1_signupsignin/oauth2/v2.0/authorize? . http_build_query([

            client_id     => YOUR_CLIENT_ID,

            response_type => code,

            redirect_uri  => https://yourdomain.com/callback,

            response_mode => query,

            scope         => openid profile email,

            nonce         => bin2hex(random_bytes(16)),

            state         => bin2hex(random_bytes(16)),

        ]);

        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 换取 token

        $tokenResponse = \GuzzleHttp\Client()->post(

            https://<your-tenant>.b2clogin.com/<your-tenant>.onmicrosoft.com/B2C_1_signupsignin/oauth2/v2.0/token,

            [

                form_params => [

                    grant_type    => authorization_code,

                    client_id     => YOUR_CLIENT_ID,

                    client_secret => YOUR_CLIENT_SECRET,

                    code          => $code,

                    redirect_uri  => https://yourdomain.com/callback,

                    scope         => openid profile email

                ]

            ]

        );

        $tokens = json_decode($tokenResponse->getBody(), true);

     

        // 2. 验证 id_token(关键!)

        $jwksUri = https://<your-tenant>.b2clogin.com/<your-tenant>.onmicrosoft.com/discovery/v2.0/keys?p=B2C_1_signupsignin;

        $jwks = json_decode(file_get_contents($jwksUri), true);

        $key = \Firebase\JWT\JWK::parseKeySet($jwks);

     

        $payload = \Firebase\JWT\JWT::decode($tokens[id_token], $key, [RS256]);

     

        // 3. 登录成功,写入会话

        $_SESSION[user] = [

            sub   => $payload->sub,

            email => $payload->email ?? null,

            name  => $payload->name ?? null

        ];

     

        return $response->withStatus(302)->withHeader(Location, /dashboard);

    });

  3. 安全注意事项

    • ✅ 始终验证 id_token 的签名、iss(应为 https://<tenant>.b2clogin.com/<tenant-guid>/v2.0/)、aud(必须匹配 client_id)、exp 和 nbf;
    • ✅ 使用 state 参数防止 CSRF(务必在 session 中存储并比对);
    • ✅ 生产环境禁用 http://localhost 重定向 URI;
    • ✅ 敏感凭据(client_secret)不得硬编码,应通过环境变量注入(.env + vlucas/phpdotenv);
    • ⚠️ Slim 默认无会话中间件,需手动启用:$app->add(new \Slim\Middleware\SessionMiddleware());。
  4. 部署到 Azure(推荐方式)

    • 在 Azure App Service 中创建 PHP 环境(建议 PHP 8.1+);
    • 启用本地 Git 部署:App Service → “Deployment Center” → “Local Git” → 设置凭据;
    • 初始化本地仓库并推送:

      1

      2

      3

      4

      5

      git init

      git remote add azure https://<username>@<app-name>.scm.azurewebsites.net:443/<app-name>.git

      git add .

      git commit -m "Initial B2C integration"

      git push azure master

? 提示:若坚持使用 Slim(而非 Laravel),可参考社区维护的轻量 OIDC 客户端库(如 web-auth/webauthn-lib 或 jumbojett/openid-connect-php),避免重复造轮子。官方示例虽基于 Laravel,但其 config/b2c.php 和 AuthController.php 的逻辑可直接迁移至 Slim 的路由与中间件中。

通过以上配置,您的 PHP 客户门户即可获得企业级身份认证能力,并为后续与 Dynamics CE 的 API 集成(通过 access_token 调用 Web API)奠定坚实基础。

“Azure B2C 与 PHP Web 应用集成完整教程” 的相关文章

云服务器市场增长

云服务器市场增长 大家好,作为一个每天依赖云服务器的开发者,我亲身感受到市场的飞速膨胀。想象一下,几年前我还得在办公室的老旧电脑前苦苦挣扎,处理数据时总是卡顿不堪,但现在,只需轻轻一点,就能在云端获得无限算力。这不仅仅是技术的进步,更是生活节奏的改变。你是否也曾经历过类似时刻?或许你正从本地服务器迁移到云服务器上,那种轻松自如的感觉,就像从一匹老马换成了一匹喷气式马,效率翻倍,却省去了维护的烦恼。…

1元买走一台云服务器,这种天上掉馅饼的事存在吗?

1元买走一台云服务器,这种天上掉馅饼的事存在吗? 那天,我在咖啡馆里刷手机,偶然看到一个广告:“只需1元,就能买走一台高性能云服务器!容量无限,稳定快速,适合创业和学习。”我的心跳突然加速了。作为一个刚毕业的大学生,我平时靠打工赚钱,偶尔做点小网站赚点外快。云服务器听起来很酷,能让我轻松托管项目,但1元?这简直像天上掉馅饼一样,太不可思议了。 我立刻分享了这个消息给我的朋友小李。他是个技术宅,平时…

2021年最全云服务器优惠大揭秘

2021年最全云服务器优惠大揭秘 嗨,大家好,我是小明,一个普通的小白领,最近我打算自己建个网站分享旅行照片和心得。刚开始,我觉得这挺简单的,但一查资料,就陷入了云服务器的世界。哈哈,别笑,我刚开始也觉得云服务器是高科技的东西,搞得我一头雾水。不过,2021年的时候,各大云服务商推出了不少优惠套餐,让我这个新手觉得机会来了。你想知道2021年云服务器优惠套餐有哪些吗?让我来和你分享我的经历。 回想…

(html)如何发布_发布HTML文件到网络的方法【网络】

(html)如何发布_发布HTML文件到网络的方法【网络】

可通过四种方式将HTML文件部署为公开网站:一、GitHub Pages免费托管;二、云存储服务(如阿里云OSS)启用静态网站托管;三、VPS配置Nginx/Apache服务器;四、Netlify/Vercel无服务器快速部署。 如果您已创建好一个 HTML 文件,但希望他人能通过互联网访问它,则需要将该文件部署到可公开访问的服务器上。以下是实现此目标的多种方法: 一、使用 GitHub Pa…

1PB等于多少TB 大容量存储单位换算【科普】

1PB等于多少TB 大容量存储单位换算【科普】

1PB等于1024TB(二进制标准)或1000TB(十进制SI标准);操作系统按1024进制显示,厂商按1000进制标称,故1PB硬盘在Windows中通常显示约909TB。 如果您在查阅存储设备参数或数据报告时看到“PB”单位,却不确定它与更常见的“TB”之间如何换算,则可能是由于对二进制存储单位体系的理解存在偏差。以下是关于1PB等于多少TB的准确换算说明: 一、基于国际标准二进制前缀的换…

2025年ARM架构电脑系统前景分析  Window on ARM与macOS的未来

2025年ARM架构电脑系统前景分析 Window on ARM与macOS的未来

Windows on ARM受限于软件兼容性,macOS凭借软硬件协同在Apple Silicon上表现更优,两者均通过云服务与AI加速提升体验,但生态策略不同。 如果您正在考虑购买或升级一台基于ARM架构的电脑,可能会对Windows on ARM和macOS系统的未来发展感到好奇。当前市场格局正受到性能、软件兼容性和生态系统支持等多重因素的影响,以下是对此现状的分析。 本文运行环境:MacB…