You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP版Kiota MS Graph SDK Beta如何添加Refresh Token避免重复授权

实现PHP版Kiota MS Graph SDK Beta持久授权(Refresh Token)

要解决每次刷新页面都需重新获取授权码的问题,核心是保存并复用Refresh Token,步骤如下:

1. 确保授权请求包含offline_access权限

只有添加该权限,微软才会返回Refresh Token。授权URL构建时必须包含这个scope:

$authUrl = "https://login.microsoftonline.com/tenantId/oauth2/v2.0/authorize?" . http_build_query([
    'client_id' => 'clientId',
    'response_type' => 'code',
    'redirect_uri' => 'redirectUri',
    'scope' => implode(' ', ['User.Read', 'Mail.ReadWrite', 'offline_access']), // 必须加offline_access
    'response_mode' => 'query'
]);

2. 首次授权后保存Token凭证

拿到授权码后,请求Token并将access_token、refresh_token和过期时间存入持久存储(示例用Session,生产环境建议用加密缓存/数据库):

session_start();

if (isset($_GET['code'])) {
    $tokenRequestContext = new AuthorizationCodeContext(
        'tenantId',
        'clientId',
        'clientSecret',
        $_GET['code'],
        'redirectUri'
    );
    
    $tokenProvider = new ClientCredentialTokenProvider($tokenRequestContext);
    $tokenResult = $tokenProvider->getTokenAsync()->wait();
    
    // 保存Token信息到Session
    $_SESSION['graph_token'] = [
        'access_token' => $tokenResult->getToken(),
        'refresh_token' => $tokenResult->getRefreshToken(),
        'expires_at' => time() + $tokenResult->getExpiresIn()
    ];

    // 跳转回业务页面,避免重复提交授权码
    header("Location: /your-app-page.php");
    exit;
}

3. 后续请求复用/刷新Token

每次页面加载时,先检查本地存储的Token是否有效,无效则用Refresh Token获取新Token:

session_start();

$scopes = ['User.Read', 'Mail.ReadWrite'];
$graphServiceClient = null;

if (isset($_SESSION['graph_token'])) {
    $tokenData = $_SESSION['graph_token'];

    // 检查Access Token是否未过期
    if (time() < $tokenData['expires_at']) {
        // 使用现有有效Token初始化客户端
        $tokenContext = new StaticTokenContext($tokenData['access_token']);
        $graphServiceClient = new GraphServiceClient($tokenContext, $scopes);
    } else {
        // 用Refresh Token刷新获取新Token
        $refreshTokenContext = new RefreshTokenContext(
            'tenantId',
            'clientId',
            'clientSecret',
            $tokenData['refresh_token']
        );

        $tokenProvider = new ClientCredentialTokenProvider($refreshTokenContext);
        $newTokenResult = $tokenProvider->getTokenAsync()->wait();

        // 更新存储的Token信息(注意:新的Refresh Token可能会替换旧的)
        $_SESSION['graph_token'] = [
            'access_token' => $newTokenResult->getToken(),
            'refresh_token' => $newTokenResult->getRefreshToken(),
            'expires_at' => time() + $newTokenResult->getExpiresIn()
        ];

        $graphServiceClient = new GraphServiceClient(new StaticTokenContext($newTokenResult->getToken()), $scopes);
    }
} else {
    // 无有效Token,跳转至授权页面
    header("Location: /auth.php");
    exit;
}

// 执行Graph请求
$user = $graphServiceClient->users()->byUserId('[userPrincipalName]')->get()->wait();

关键注意事项

  • Refresh Token更新:部分场景下微软会返回新的Refresh Token,务必替换旧的,避免后续刷新失败。
  • 安全存储:生产环境不要用明文Session存储Token,建议用加密的数据库或Redis缓存。
  • 异常处理:需捕获Refresh Token过期的情况,此时需引导用户重新授权。

内容的提问来源于stack exchange,提问作者michael6969

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 05:53:21