我正试图通过oAuth连接到Twitter。我正在向API发出POST请求https://api.twitter.com/oauth/request_token.
这是我的Base签名字符串示例
POST&https%3A%2F%2Fapi.twitter.com%2Foauth%2Frequest_token&oauth_callback%3Dhttp%253A%252F%252Fapi.ec2.phunware.com%252Fapi%252Ftwitter%26oauth_consumer_key%3D6jq5dNZcccoPbApAJ0sOaA%26oauth_nonce%3DN2ZiMjViYzhlMDUxNDIyZWIwYjQ4NmU0ZjM1MDg4NTY%3D%26oauth_signature_method%3DHMAC-SHA1%26oauth_timestamp%3D1362843354%26oauth_version%3D1.0
我用过这个工具http://quonos.nl/oauthTester/验证我的基本签名。
这里是对应的标题
OAuth oauth_callback="http%3A%2F%2Fapi.ec2.phunware.com%2Fapi%2Ftwitter",oauth_consumer_key="6jq5dNZcccoPbApAJ0sOaA",oauth_nonce="N2ZiMjViYzhlMDUxNDIyZWIwYjQ4NmU0ZjM1MDg4NTY=",oauth_signature_method="HMAC-SHA1",oauth_signature="7ney2RxElbHUl2t1Jnz57pQpmFs%3D",oauth_timestamp="1362843354",oauth_version="1.0"
我在我的MAC终端中尝试了以下命令
curl --request 'POST' 'https://api.twitter.com/oauth/request_token' --header 'Authorization: OAuth oauth_callback="http%3A%2F%2Fapi.ec2.phunware.com%2Fapi%2Ftwitter",oauth_consumer_key="6jq5dNZcccoPbApAJ0sOaA",oauth_nonce="N2ZiMjViYzhlMDUxNDIyZWIwYjQ4NmU0ZjM1MDg4NTY=",oauth_signature_method="HMAC-SHA1",oauth_signature="7ney2RxElbHUl2t1Jnz57pQpmFs%3D",oauth_timestamp="1362843354",oauth_version="1.0"' --verbose
我得到401未经授权的错误。我试图设置oauth_callback="oob",但我仍然得到同样的错误。
请帮助。我正在使用Blackberry NativeSDK编码。我在这里粘贴代码。当我尝试通过Blackberry 10.1 Simulator时,我得到204错误。
QByteArray Twitter::generateTimeStamp()
{
QDateTime current = QDateTime::currentDateTime();
uint seconds = current.toTime_t();
return QString::number(seconds,10).toUtf8();
}
QByteArray Twitter::generateNonce()
{
QString nonce = QUuid::createUuid().toString();
nonce.remove(QRegExp("[^a-zA-Z\\d\\s]"));
qDebug()<< nonce.toUtf8();
return nonce.toUtf8().toBase64();
}
QByteArray Twitter::generateSignatureBase(const QUrl& url, HttpMethod method, const QByteArray& timestamp, const QByteArray& nonce,bool addCallbackURL)
{
QList<QPair<QByteArray, QByteArray> > urlParameters = url.encodedQueryItems();
QList<QByteArray> normParameters;
QListIterator<QPair<QByteArray, QByteArray> > i(urlParameters);
while(i.hasNext()){
QPair<QByteArray, QByteArray> queryItem = i.next();
QByteArray normItem = queryItem.first + '=' + queryItem.second;
normParameters.append(normItem);
}
//consumer key
normParameters.append(QByteArray("oauth_consumer_key=") + consumer->consumerKey());
//token
if(accessToken != NULL){
normParameters.append(QByteArray("oauth_token=") + accessToken->oauthToken());
}
//signature method, only HMAC_SHA1
normParameters.append(QByteArray("oauth_signature_method=HMAC-SHA1"));
//time stamp
normParameters.append(QByteArray("oauth_timestamp=") + timestamp);
//nonce
normParameters.append(QByteArray("oauth_nonce=") + nonce);
//version
normParameters.append(QByteArray("oauth_version=1.0"));
//callback url
if(addCallbackURL)
normParameters.append(QByteArray("oauth_callback=") + QByteArray(CALLBACK_URL).toPercentEncoding());
//OAuth spec. 9.1.1.1
qSort(normParameters);
qDebug()<<normParameters;
QByteArray normString;
QListIterator<QByteArray> j(normParameters);
while (j.hasNext()) {
normString += j.next().toPercentEncoding();
normString += "%26";
}
normString.chop(3);
qDebug()<<normString;
//OAuth spec. 9.1.2
QString urlScheme = url.scheme();
QString urlPath = url.path();
QString urlHost = url.host();
QByteArray normUrl = urlScheme.toUtf8() + "://" + urlHost.toUtf8() + urlPath.toUtf8();
QByteArray httpm;
switch (method)
{
case GET:
httpm = "GET";
break;
case POST:
httpm = "POST";
break;
case DELETE:
httpm = "DELETE";
break;
case PUT:
httpm = "PUT";
break;
}
qDebug()<<"signature base="<<httpm + '&' + normUrl.toPercentEncoding() + '&' + normString;
//OAuth spec. 9.1.3
return httpm + '&' + normUrl.toPercentEncoding() + '&' + normString;
}
QByteArray Twitter::generateAuthorizationHeader( const QUrl& url, HttpMethod method,bool addCallbackURL )
{
QByteArray timeStamp = generateTimeStamp();
QByteArray nonce = generateNonce();
QByteArray baseString = generateSignatureBase(url, method, timeStamp, nonce,addCallbackURL);
QByteArray key = consumer->consumerSecret() + '&';
if(accessToken != NULL)
key = key + accessToken->oauthTokenSecret();
QByteArray signature = HMACSH1::hmacSha1(key,baseString).toPercentEncoding();
QByteArray header;
header += "OAuth ";
if(addCallbackURL)
header += "oauth_callback=\"" + QByteArray(CALLBACK_URL).toPercentEncoding() + "\",";
header += "oauth_consumer_key=\"" + consumer->consumerKey() + "\",";
header += "oauth_nonce=\"" + nonce + "\",";
header += "oauth_signature_method=\"HMAC-SHA1\",";
header += "oauth_signature=\"" + signature + "\",";
header += "oauth_timestamp=\"" + timeStamp + "\",";
if(accessToken != NULL)
header += "oauth_token=\"" + accessToken->oauthToken() + "\",";
header += "oauth_version=\"1.0\"";
qDebug()<<"header =" <<header;
return header;
}
void Twitter::requestForToken()
{
QUrl url(TWITTER_REQUEST_TOKEN_URL);
QByteArray oauthHeader = generateAuthorizationHeader(url, POST,true);
QNetworkRequest req(url);
req.setRawHeader("Authorization", oauthHeader);
req.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
req.setHeader(QNetworkRequest::ContentLengthHeader,"0");
QNetworkReply *reply = networkAccessManager->post(req, QByteArray());
connect(networkAccessManager, SIGNAL(finished ( QNetworkReply*)), this, SLOT(tokenFetchSuccessfull(QNetworkReply*)));
connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(tokenFetchFailed(QNetworkReply::NetworkError)));
qDebug()<<"Request For Token";
}
您提到您正在使用NativeSDK,您是否也在使用Cascades?如果是这样,您可能会更幸运地使用GitHub的bb-cascades-oauth库。它内置了对OAuth1和OAuth2的支持。
此外,根据这里的提示,错误的时间戳可能是一个常见问题,因此请确保您的模拟器具有正确的日期和时间。
另一位开发人员发现http://quonos.nl/oauthTester/需要一个不正确的双转义标头,并在发出实际身份验证请求时导致401个错误。我注意到您使用了相同的测试仪,并且上面的基本签名字符串中也有双转义,因此您可能希望尝试不使用双转义。
org.springframework.web.client.ResourceAccessException:POST请求“https://api.twitter.com/oauth/request_token”时的I/O错误:连接超时;嵌套异常java.net.SocketException:连接超时org.springframework.web.client.RestTemplate.do执行
我尝试通过https://api.twitter.com/oauth/request_token请求令牌,但总是得到401错误。 我通过curl进行测试(很容易看到发生了什么)。 curl--请求“POST”https://api.twitter.com/oauth/request_token“--标头”授权:OAuth OAuth\u回调=”http://www.domain.tld/blank
我试图从twitter api获取oauth\u令牌,但出现异常: 错误流获取: 验证oauth签名和令牌失败 以下是SignatureBasString、签名和授权标头示例: SignatureBasString:POST 下面是一个代码: 名称值对比较器: URL编码 请求方法 这里是一个twitter应用程序设置: 消费者密钥(API密钥):2YhNLyum1VY10UrWBMqBnatiT
我试图将twitter登录选项添加到我的python应用程序中,我从web服务器收到以下错误: GET/social auth/login/twitter/HTTP/1.1“500 103190 403客户端错误:url禁止:https://api.twitter.com/oauth/request_token 我在本地主机上使用SSL开发环境django unicorn。我查看了Twitter回
问题内容: 尝试指定自定义的肥皂标题。不知道如何填充SoapEnvelope.headerOut属性。 到目前为止我的代码? 这是标题WSDL提取… 问题答案: headerOut是您需要构建的Element []。 像这样 然后将其添加到数组中。
更新时间:2018-09-17 14:27:32 本文将以树莓派开发板为例进行介绍 Link Develop 设备接入,开始前请确保完成了测试设备创建。 前期准备 硬件 树莓派开发板+KY-016 RGB LED 小灯模块 软件 在树莓派刷入 NOBOS 固件:https://www.raspberrypi.org/downloads/noobs/ 在树莓派上安装 Node.js (版本要求>=8