当前位置:首页 > 云服务器

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

游戏科技网2026年09月14日 21:28云服务器20
描述:本文详细介绍如何在 php(尤其是 slim 框架)项目中集成 azure ad b2c 实现安全、标准化的用户认证,涵盖注册/登录流程、openid connect 配置、token 验证及 azure 部署关键步骤。Azure Active Directory B2C(Azure AD B2C)…

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

本文详细介绍如何在 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 路由中实现登录与回调逻辑:

    Azure B2C 与 PHP Web 应用集成完整教程
    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 应用集成完整教程” 的相关文章

5元云服务器:入门级新手首选

5元云服务器:入门级新手首选 我是一名刚毕业的大学生,对编程充满了热情,但现实总是骨感一些。刚踏入职场,我梦想着能独立开发一个网站或应用,却苦于没有足够的资源。买一台实体服务器太贵,租个虚拟空间又觉得…

6元服务器租用,高性价比VPS主机推荐

6元服务器租用,高性价比VPS主机推荐 记得去年我刚开始创业,做了一个小型网站来展示我的产品。那时,我手头紧,预算有限,却急着需要一个可靠的服务器来托管网站。作为一个普通上班族,我对技术懂得不多,但我…

2021年云服务器优惠套餐推荐

2021年云服务器优惠套餐推荐 嗨,朋友们!你是否曾经在深夜里,面对一堆代码和服务器错误,感叹说:“为什么我的项目老是卡顿?”如果是这样的话,那你可能正在寻找2021年云服务器优惠套餐的解决方案。作为…

云服务器市场增长

云服务器市场增长 大家好,作为一个每天依赖云服务器的开发者,我亲身感受到市场的飞速膨胀。想象一下,几年前我还得在办公室的老旧电脑前苦苦挣扎,处理数据时总是卡顿不堪,但现在,只需轻轻一点,就能在云端获得…

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

1元买走一台云服务器,这种天上掉馅饼的事存在吗? 那天,我在咖啡馆里刷手机,偶然看到一个广告:“只需1元,就能买走一台高性能云服务器!容量无限,稳定快速,适合创业和学习。”我的心跳突然加速了。作为一个…

云服务器10元月:经济型服务价格新记录

云服务器10元/月:经济型服务价格新记录 最近,云服务器的价格被推向了一个新低,10元一个月的方案让许多人惊喜不已。这不仅仅是数字上的变化,更是科技服务普惠化的一个标志。云服务器作为一种基于云计算的虚…