验证Qt/c++到azure存储(Ubuntu)
Authenticate Qt/c++ to azure storage (Ubuntu)
谁能帮助我使用Qt/c++访问azure存储?
这是我的代码。
QString date = "Tue, 18 Mar 2014 21:49:13 GMT";
QString datastring = "GETnnnnnnnnnnnnx-ms-date:"+date+"nx-ms-version:2009-09-19n/mystorage/ncomp:list";
QByteArray ba = datastring.toUtf8();
unsigned char* signature = reinterpret_cast<unsigned char*>(ba.data());
QByteArray kba = QByteArray::fromBase64("<accountkey>");
unsigned char* key = (unsigned char*) kba.data();
unsigned char result[EVP_MAX_MD_SIZE];
unsigned int result_len;
ENGINE_load_builtin_engines();
ENGINE_register_all_complete();
HMAC_CTX ctx;
HMAC_CTX_init(&ctx);
HMAC_Init_ex(&ctx, key, strlen((const char*)key), EVP_sha256(), NULL);
HMAC_Update(&ctx, signature, strlen((const char*)signature));
HMAC_Final(&ctx, result, &result_len);
HMAC_CTX_cleanup(&ctx);
QByteArray array = QByteArray::fromRawData((char*)result, result_len);
array = array.toBase64();
qDebug() << "signature hash" << array;
QString version = "2009-09-19";
//requesting the list of container to Windows Azure
QNetworkAccessManager* manager = new QNetworkAccessManager();
QNetworkRequest request;
request.setUrl(QUrl("http://myaccount.blob.core.windows.net/?comp=list"));
request.setRawHeader("Authorization","SharedKey myaccount:"+array);
request.setRawHeader("x-ms-date", date.toStdString().c_str());
request.setRawHeader("x-ms-version", version.toStdString().c_str());
manager->get(request);
请求返回以下错误
<?xml version="1.0" encoding="utf-8"?><Error><Code>AuthenticationFailed</Code><Message>Server failed to authenticate the request. Make sure the value of Authorization header is formed correctly including the signature.
RequestId:6f7a9bf3-81f2-4191-84b8-c1cd1747411f
Time:2014-03-18T05:03:12.2134625Z</Message><AuthenticationErrorDetail>The MAC signature found in the HTTP request 'T4vqb/a9SkDnWLvHXyhIEBREHWpBMfhuuMFQwxtRXMs=' is not the same as any computed signature. Server used following string to sign: 'GET
x-ms-date:Tue, 18 Mar 2014 21:49:13 GMT
x-ms-version:2009-09-19
/mystorage/
comp:list'.</AuthenticationErrorDetail></Error>"
我不知道代码中的确切错误。我该如何解决这个问题?
我从这里得到了源代码
你可以使用这个简约的Qt类来访问Azure存储(下载/上传/列出blobs):https://github.com/QuentinCG/QAzureStorageRestApi
这个类没有任何依赖,除了Qt。
下面是用于生成共享密钥的函数的复制粘贴:
QString QAzureStorageRestApi::generateAutorizationHeader(const QString& httpVerb, const QString& container,
const QString& blobName, const QString& currentDateTime,
const long& contentLength, const QStringList additionnalCanonicalHeaders,
const QStringList additionnalCanonicalRessources)
{
// Create canonicalized header
QString canonicalizedHeaders;
for (const QString& additionnalCanonicalHeader : additionnalCanonicalHeaders)
{
canonicalizedHeaders.append(additionnalCanonicalHeader+"n");
}
canonicalizedHeaders.append(QString("x-ms-date:%1nx-ms-version:%2").arg(currentDateTime, m_version));
// Create canonicalized ressource
QString canonicalizedResource;
if (blobName.isEmpty())
{
canonicalizedResource = QString("/%1/%2").arg(m_accountName, container);
}
else
{
canonicalizedResource = QString("/%1/%2/%3").arg(m_accountName, container, blobName);
}
for (const QString& additionnalCanonicalRessource : additionnalCanonicalRessources)
{
canonicalizedResource.append("n"+additionnalCanonicalRessource);
}
// Create signature
QString signature = generateHeader(httpVerb, "", "", QString::number(contentLength), "", "", "", "",
"", "", "", "", canonicalizedHeaders, canonicalizedResource);
// Create authorization header
QByteArray authorizationHeader = QMessageAuthenticationCode::hash(
QByteArray(signature.toUtf8()),
QByteArray(QByteArray::fromBase64(m_accountKey.toStdString().c_str())),
QCryptographicHash::Sha256);
authorizationHeader = authorizationHeader.toBase64();
return QString("SharedKey %1:%2").arg(m_accountName, QString(authorizationHeader));
}
(注意:该类基于http://ericzwliu.blogspot.de/2015/02/qt-azure-blob-storage.html)
相关文章:
- 将字符串存储在c++中的稳定内存中
- 在Ubuntu 16.04上安装Cilk时出现问题
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- 如何在Ubuntu中使用cmake设置qt4
- 使用QProcess执行命令,并将结果存储在QStringList中
- 访问存储在向量C++中的结构的多态成员
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 如何从存储在std::映射中的std::集中删除元素
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 当字符串存储在变量中时,如何将字符串转换为wchar_t
- 使用无符号字符数组有效存储内存
- 如何在cpp.中使用协议缓冲区存储大缓冲区/数组(char/int)
- 使用 pqxx 将 std::vector 存储在 postgresql 中,并从数据库中检索它
- 带结构的二维矢量:如何存储元素
- 添加存储在向量中的大整数的函数出现问题
- 从文件中读取多个字节,并将它们存储在C++中进行比较
- 在std::vector上存储带有模板的类实例
- 验证Qt/c++到azure存储(Ubuntu)