当前位置: 首页 > 知识库问答 >
问题:

401响应推特反向身份验证

容学林
2023-03-14

这是我使用的授权标头:

Authorization = "OAuth oauth_consumer_key=\"2D9rLD8Lu23hrchrh4VMBkQ6AZKHYi2yY2oeuoeutcFMdAs\", oauth_nonce=\"-486353546\", oauth_signature="x3NdGnJmBTUAICBRE9C44N8mFd4%3D", oauth_signature_method=\"HMAC-SHA1\", oauth_timestamp=\"137663828056\", oauth_version=\"1.0\", x_auth_mode=\"reverse_auth\"";

以下是我使用的基本字符串:

https://api.twitter.com/oauth/access_token

以下是我的推特文档:

步骤1:获取特殊请求令牌

首先,您使用应用程序的使用者密钥向Twitter请求令牌URLhttps://api.twitter.com/oauth/request_token发出HTTPS请求。除了传统的oauth_*签名参数之外,您还必须包含设置为reverse_auth值的x_auth_mode。

例如,考虑使用令牌秘密ydC2yUbFaScbSlykO0PmrMjXFeLraSi3Q2HfTOlGxQM签名的具有以下值的请求:

这里使用的代币仅用于演示目的,不适用于您。

oauth\u consumer\u key JP3PyvG67rXRsnayOJOcQ oauth\u nonce 1B7D865D-9E15-4ADD-8165-EF90D7A7D3D2 oauth\u signature\u方法HMAC-SHA1 oauth\u时间戳1322697052 oauth\u版本1.0 x\u auth\u mode reverse\u auth这些参数应生成一个签名基字符串,如下所示:

帖子

(为清晰起见,添加了换行):

OAuthoauth_nonce="xq2maKtilFhVTC1MSxVC4cQIJLd53O6w97YmrdOGSk8",oauth_signature_method="HMAC-SHA1",oauth_timestamp="1322697052",oauth_consumer_key="JP3PyvG67rXRsnayOJOcQ",oauth_token="5mgkU82W0PTA0DLgSIA5vFK6c08i8dXzrbLnX06vl38",oauth_signature="aOM/wW2kAowAeHBRvw7faH245p0=",oauth_version="1.0"

编辑:我仍然得到401英镑。我使用了以下代码来生成oauth\u签名,因此现在我的授权标头如下所示:oauth oauth\u timestamp=“1376639141”,oauth\u nonce=“BB2D2634F3-99A5-4B64-8CB34E-2314CE9E4FD7”,oauth\u version=“1.0”,oauth\u consumer\u key=“MRCD8LUSNKJKFACHHYI2YY2QWH5TCFMDAS”,oauth\u签名方法=“HMAC-SHA1”,oauth\u签名=“MOER8H7XZLUAH”DOAAAFZPV6N4NOEU=“

NSString *OAuthorizationHeader(NSURL *url, NSString *method, NSData *body, NSString *_oAuthConsumerKey, NSString *_oAuthConsumerSecret, NSString *_oAuthToken, NSString *_oAuthTokenSecret)
{
    NSString *_oAuthNonce = [NSString ab_GUID];
    NSString *_oAuthTimestamp = [NSString stringWithFormat:@"%d", (int)[[NSDate date] timeIntervalSince1970]];
    NSString *_oAuthSignatureMethod = @"HMAC-SHA1";
    NSString *_oAuthVersion = @"1.0";

    NSMutableDictionary *oAuthAuthorizationParameters = [NSMutableDictionary dictionary];
    oAuthAuthorizationParameters[@"oauth_nonce"] = _oAuthNonce;
    oAuthAuthorizationParameters[@"oauth_timestamp"] = _oAuthTimestamp;
    oAuthAuthorizationParameters[@"oauth_signature_method"] = _oAuthSignatureMethod;
    oAuthAuthorizationParameters[@"oauth_version"] = _oAuthVersion;
    oAuthAuthorizationParameters[@"oauth_consumer_key"] = _oAuthConsumerKey;
    if(_oAuthToken)
        oAuthAuthorizationParameters[@"oauth_token"] = _oAuthToken;

    // get query and body parameters
    NSDictionary *additionalQueryParameters = [NSURL ab_parseURLQueryString:[url query]];
    NSDictionary *additionalBodyParameters = nil;
    if(body) {
        NSString *string = [[[NSString alloc] initWithData:body encoding:NSUTF8StringEncoding] autorelease];
        if(string) {
            additionalBodyParameters = [NSURL ab_parseURLQueryString:string];
        }
    }

    // combine all parameters
    NSMutableDictionary *parameters = [[oAuthAuthorizationParameters mutableCopy] autorelease];
    if(additionalQueryParameters) [parameters addEntriesFromDictionary:additionalQueryParameters];
    if(additionalBodyParameters) [parameters addEntriesFromDictionary:additionalBodyParameters];

    // -> UTF-8 -> RFC3986
    NSMutableDictionary *encodedParameters = [NSMutableDictionary dictionary];
    for(NSString *key in parameters) {
        NSString *value = parameters[key];
        encodedParameters[[key ab_RFC3986EncodedString]] = [value ab_RFC3986EncodedString];
    }

    NSArray *sortedKeys = [[encodedParameters allKeys] sortedArrayUsingFunction:SortParameter context:encodedParameters];

    NSMutableArray *parameterArray = [NSMutableArray array];
    for(NSString *key in sortedKeys) {
        [parameterArray addObject:[NSString stringWithFormat:@"%@=%@", key, encodedParameters[key]]];
    }
    NSString *normalizedParameterString = [parameterArray componentsJoinedByString:@"&"];

    NSString *normalizedURLString = [NSString stringWithFormat:@"%@://%@%@", [url scheme], [url host], [url path]];

    NSString *signatureBaseString = [NSString stringWithFormat:@"%@&%@&%@",
                                     [method ab_RFC3986EncodedString],
                                     [normalizedURLString ab_RFC3986EncodedString],
                                     [normalizedParameterString ab_RFC3986EncodedString]];

    NSString *key = [NSString stringWithFormat:@"%@&%@",
                     [_oAuthConsumerSecret ab_RFC3986EncodedString],
                     (_oAuthTokenSecret) ? [_oAuthTokenSecret ab_RFC3986EncodedString] : @""];

    NSData *signature = HMAC_SHA1(signatureBaseString, key);
    NSString *base64Signature = [signature base64EncodedString];

    NSMutableDictionary *authorizationHeaderDictionary = [[oAuthAuthorizationParameters mutableCopy] autorelease];
    authorizationHeaderDictionary[@"oauth_signature"] = base64Signature;

    NSMutableArray *authorizationHeaderItems = [NSMutableArray array];
    for(NSString *key in authorizationHeaderDictionary) {
        NSString *value = authorizationHeaderDictionary[key];
        [authorizationHeaderItems addObject:[NSString stringWithFormat:@"%@=\"%@\"",
                                             [key ab_RFC3986EncodedString],
                                             [value ab_RFC3986EncodedString]]];
    }

    NSString *authorizationHeaderString = [authorizationHeaderItems componentsJoinedByString:@", "];

    authorizationHeaderString = [NSString stringWithFormat:@"OAuth %@", authorizationHeaderString];

    return authorizationHeaderString;
}

我传递给此方法的参数是url:https://api.twitter.com/oauth/request_token,方法:POST,正文:nil,oAuthConsumerToken:my key,OAuthConsumerCret:my secret,oAuthToken:nil,oAuthTokenSecret:nil。

编辑我尝试使用这个oauth测试控制台来验证我是否正确生成了oauth签名,但似乎我需要成员的令牌和密码:


共有1个答案

程正阳
2023-03-14

您尚未在授权标头中包含oauth\u签名。

 类似资料:
  • 问题内容: 在flask中,我使用以下代码段启用HTTP身份验证: 现在,根据我过去使用Flask的经验,如果某人的凭据不正确,我想让他们知道我可以打电话给: 这为你提供了基本的apache 401响应。有谁知道我如何使用上面的代码片段实现这一目标? 谢谢 问题答案: 在Flask中,自定义错误响应确实非常容易。创建一个仅将参数作为HTTP错误状态代码的函数,使其返回flask.Response实

  • 问题内容: 我有一个文件request.js,其中包含axios ajax请求的包装。我正在从多个React组件中调用请求函数,当请求之一失败时,我想刷新令牌并再次重试所有失败的请求。我可以使用拦截器,但是我不知道如何实现它。请帮忙。 request.js 问题答案: 我用以下代码工作 [编辑]它的2019,这是相同的另一个实现。上面的解决方案很棒,但是不能用于多个失败的请求,反过来,它也会调用带

  • 我对Web浏览器的基本身份验证有点困惑。我原以为Web浏览器只会在之前的响应中收到HTTP 401状态后发送授权标头。然而,似乎Chrome在之后的每个请求中都发送授权标头。它包含我曾经输入的数据,以响应我网站上的401,并与每条消息一起发送(根据Chrome和我的Web服务器附带的开发人员工具)。这是预期的行为吗?我应该在我的401中使用一些标头来推断不应该缓存授权内容吗?我目前正在使用WWW-

  • 我正在为我的azure无状态服务fabric应用程序从密钥存储库中获取机密值,并在100s密钥存储库机密中仅有2个密钥存储库机密获得401个依赖项错误(如果我通过connected application insight检查的话)。下面给出的是通过应用程序洞察显示的依赖错误的截图,其中一个密钥存储库的秘密。 这里请求路径是https://mykeyvaultname.vault.azure.net

  • 问题内容: 我正在使用HP ALM版本12.55.113。我正在尝试通过REST- API自动上传测试结果。经过身份验证并尝试读取一个简单的缺陷后,我收到了401未经身份验证的错误。我使用以下示例代码检索有效的LWSSO和QCSession Cookie: 我得到以下控制台输出: 登录:InboundJaxrsResponse {context = ClientResponse {method =

  • 我试图设置2方式ssl身份验证。我的要求是经纪人应该只认证特定的客户。 我的组织有一个CA,它发行pkcs12格式的所有证书。我遵循的步骤如下。 获取代理的证书,并在代理密钥库中配置它 当我运行代理和客户端时,我希望代理验证客户端并建立ssl连接。但是下面的错误被抛出。 当我用只包含CA证书的信任存储文件替换 /etc/pki/java/cacerts代理信任存储时,它工作得很好。但是它将验证任何