std::string OAuth::createSignature(HTTPRequest& r) { // Create signature base string and key PercentEncode encoder; std::string signature_base = createSignatureBaseString(r); std::string sign_key = createSignatureSignKey(); // Create HMAC_SHA1 signature unsigned char digest[HMAC_SHA1_DIGEST_LENGTH]; HMAC_SHA1_CTX ctx; HMAC_SHA1_Init(&ctx); HMAC_SHA1_UpdateKey(&ctx, (unsigned char*)sign_key.c_str(), sign_key.size()); HMAC_SHA1_EndKey(&ctx); HMAC_SHA1_StartMessage(&ctx); HMAC_SHA1_UpdateMessage(&ctx, (unsigned char*)signature_base.c_str(), signature_base.size()); HMAC_SHA1_EndMessage(digest, &ctx); // Base64 encode std::string result; aoBase64Encoder b64; b64.Encode((const unsigned char*)digest, HMAC_SHA1_DIGEST_LENGTH); int s = b64.GetEncodedSize(); const char* encoded_data = b64.GetEncoded(); std::copy(encoded_data, encoded_data+s, std::back_inserter(result)); return result; }
QNetworkRequest TwitterRequest::createRequest(const QUrl& requestUrl, const QString httpMethod, QVariantMap params) { QMap<QString, QString> requestHeaders; QVariantMap::const_iterator i = params.constBegin(); while (i != params.constEnd()) { requestHeaders.insert(i.key(), QUrl::toPercentEncoding(i.value().toString())); ++i; } if (!m_accessToken.isEmpty()) { requestHeaders.insert(OAUTH_TOKEN, QUrl::toPercentEncoding(m_accessToken)); } requestHeaders.insert(OAUTH_CONSUMER_KEY, QUrl::toPercentEncoding(m_consumerKey)); requestHeaders.insert(OAUTH_NONCE, QUrl::toPercentEncoding(generateNonce())); requestHeaders.insert(OAUTH_SIGNATURE_METHOD, QUrl::toPercentEncoding("HMAC-SHA1")); requestHeaders.insert(OAUTH_TIMESTAMP, QUrl::toPercentEncoding(currentTime())); requestHeaders.insert(OAUTH_VERSION, QUrl::toPercentEncoding("1.0")); // Create the base signature string and sign it with the secrets. QString signatureBaseString = createSignatureBaseString( requestUrl.toString(), requestHeaders, httpMethod); QString signature = signRequest(signatureBaseString, QString(m_consumerSecret) + '&' + m_accessTokenSecret); requestHeaders.insert(OAUTH_SIGNATURE, QUrl::toPercentEncoding(signature)); // Generate authentication headers for the request. QString authHeader = generateAuthHeader(requestHeaders); QByteArray authHeaderByteArray = authHeader.toUtf8(); QNetworkRequest request(requestUrl); request.setRawHeader(HTTP_HEADER_AUTHORIZATION, authHeaderByteArray); return request; }