本文详细介绍如何在 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 应用只需:
Azure 门户配置
PHP 端集成(Slim 4 示例)
安装必要依赖:
composer require league/oauth2-client guzzlehttp/guzzle firebase/php-jwt
在 Slim 路由中实现登录与回调逻辑:
// routes.php
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
$app->get('/login', function (Request $request, Res
ponse $response) {
$authUrl = 'https://.b2clogin.com/.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://.b2clogin.com/.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://.b2clogin.com/.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');
}); 安全注意事项
部署到 Azure(推荐方式)
git init git remote add azure https://@.scm.azurewebsites.net:443/.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)奠定坚实基础。