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
相关产品推荐
相关产品推荐

