本文详细讲解如何在基于 php(特别是 slim 框架)的客户门户中集成 azure ad b2c,实现安全、可扩展的用户认证,并支持与 microsoft dynamics ce 的后续对接。
将 Azure AD B2C 集成到 PHP 技术栈(尤其是轻量级框架如 Slim)是完全可行的生产级方案,但需注意:官方示例主要基于原生 PHP + OpenID Connect(OIDC)实现,而非直接提供 Slim 专用 SDK。因此,集成核心在于正确实现 OIDC 协议流程,而非依赖框架绑定库。
环境准备
确保 PHP ≥ 7.4(推荐 8.1+),启用 curl、json、openssl 扩展。Slim v4 或 v5 均可兼容,无需 Laravel —— 示例仓库中的逻辑可完全解耦复用。
Azure 侧配置
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
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');
});Azure B2C 与 PHP/Slim 的集成本质是标准 OIDC 实现,不依赖框架深度耦合。推荐从 Azure 官方 PHP OIDC 示例出发,提取核心鉴权逻辑,再按 Slim 路由风格重构。只要严格遵循 token 获取、验证、会话管理三步,即可构建高可用、合规的客户门户认证体系,并为后续 Dynamics CE 集成奠定坚实基础。