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

Azure SDK for CPP新版如何实现刷新令牌认证?

新版Azure SDK for C++的Bearer令牌认证实现

新版Azure SDK for C++完全支持基于Bearer令牌的认证,不过采用了统一的Azure Core认证体系,和旧版实现方式有所不同,具体实现如下:

核心变化

旧版直接使用azure::storage::storage_credentials::bearer_token_credential,新版则通过Azure Core的TokenCredential抽象类实现自定义令牌管理,所有Azure服务客户端(包括Storage)都兼容这个接口。

实现步骤

1. 自定义Refresh Token凭据类

继承azure::core::TokenCredential,重写GetToken方法,内部处理refresh token获取access token的逻辑,同时负责令牌的缓存与自动刷新:

#include <azure/core/credentials/token_credential.hpp>
#include <azure/core/http/http.hpp>
#include <azure/storage/blobs.hpp>
#include <string>
#include <mutex>

class RefreshTokenCredential : public azure::core::TokenCredential {
private:
    std::string m_accountName;
    std::string m_clientId;
    std::string m_refreshToken;
    azure::core::Credentials::Token m_currentToken;
    std::mutex m_tokenMutex;

    // 实现用refresh token获取新access token的逻辑
    azure::core::Credentials::Token RefreshAccessToken() {
        // 构造Azure AD令牌请求(需替换为你的租户ID等实际参数)
        azure::core::http::Request request(
            azure::core::http::HttpMethod::Post,
            "https://login.microsoftonline.com/{your-tenant-id}/oauth2/v2.0/token");

        // 组装请求体
        std::string body = "grant_type=refresh_token"
            "&client_id=" + azure::core::http::internal::UrlEncode(m_clientId)
            "&refresh_token=" + azure::core::http::internal::UrlEncode(m_refreshToken)
            "&scope=https://storage.azure.com/.default";

        request.SetBody(body);
        request.SetHeader("Content-Type", "application/x-www-form-urlencoded");

        // 这里需要补充实际的HTTP请求发送与响应解析逻辑,提取access_token和过期时间
        azure::core::Credentials::Token newToken;
        newToken.Token = "your-new-access-token"; // 替换为实际获取的令牌
        newToken.ExpiresOn = std::chrono::system_clock::now() + std::chrono::hours(1); // 替换为实际过期时间

        return newToken;
    }

public:
    RefreshTokenCredential(std::string accountName, std::string clientId, std::string refreshToken)
        : m_accountName(std::move(accountName)), m_clientId(std::move(clientId)), m_refreshToken(std::move(refreshToken)) {}

    // SDK会自动调用此方法获取有效令牌
    azure::core::Credentials::Token GetToken(
        azure::core::Credentials::TokenRequestContext const&,
        azure::core::Context const&) override {
        std::lock_guard<std::mutex> lock(m_tokenMutex);

        // 提前5分钟刷新令牌,避免过期
        auto now = std::chrono::system_clock::now();
        if (m_currentToken.ExpiresOn > now + std::chrono::minutes(5)) {
            return m_currentToken;
        }

        m_currentToken = RefreshAccessToken();
        return m_currentToken;
    }
};

2. 使用自定义凭据创建Storage客户端

将自定义的RefreshTokenCredential传入Storage客户端(如BlobServiceClient),SDK会自动处理令牌的添加与刷新:

// 初始化自定义凭据
auto credential = std::make_shared<RefreshTokenCredential>(
    "your-storage-account-name",
    "your-client-id",
    "your-refresh-token");

// 创建Blob服务客户端
azure::storage::blobs::BlobServiceClient blobServiceClient(
    "https://your-storage-account-name.blob.core.windows.net/",
    credential);

// 后续操作无需手动处理令牌,SDK自动注入Authorization头
for (auto container : blobServiceClient.ListContainers()) {
    // 业务逻辑
}

关键注意事项

  • 无需手动将refresh token追加到请求中,SDK会自动调用GetToken获取有效access token,并以Authorization: Bearer <token>形式添加到请求头。
  • 自定义凭据内部需处理令牌缓存与过期判断,确保每次返回的令牌都是有效的。
  • 实际实现时需完善RefreshAccessToken方法中的HTTP请求发送与响应解析逻辑,确保正确获取Azure AD颁发的access token。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 13:43:11