Esempio n. 1
0
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;
}