ASP NET Core Twitter OAuth请求令牌问题

zgncompass

背景

我有一个具有Twitter应用程序设置的后端应用程序,可以查询和提取用户tweet / post数据。很好,但是,现在在前端,我还没有完整的Twitter集成设置。我的意思是,用户可以在前端输入任何Twitter用户名,并且我想确定要知道输入的Twitter用户名实际上属于该用户。使用Twitter应用程序密钥,您可以为任何Twitter帐户提取公共Twitter数据,这对于大规模数据提取以及我的概念证明工作非常有效。就目前而言,我需要在后端执行一个假设,即针对特定Twitter屏幕名称进行分析的数据也归我的Web应用程序帐户的用户所有。

拟议的Twitter解决方案

这是我一直在尝试的一堆参考文档。

https://developer.twitter.com/zh-CN/docs/basics/authentication/guides/login-with-twitter https://developer.twitter.com/zh-CN/docs/basics/authentication/api-reference/request_token https://oauth.net/core/1.0/#anchor9 https://oauth.net/core/1.0/#auth_step1

我一直在尝试遵循此方法,并且对下面发布的代码进行了不同的排列(一个不带回调URL作为参数,一个不带参数等等),但是在这一点上,并没有太大的不同。我没有取得任何成功,已经超过几天了,这真使我丧命。

编码

这是我尝试遵循上述文档中建议的OAuth规范。请注意,这是ASP.NET Core 2.2 +代码。另外,这是Twitter指南中OAuth身份验证和授权步骤1的代码。

public async Task<string> GetUserOAuthRequestToken()
{
    int timestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
    string nonce = Convert.ToBase64String(Encoding.ASCII.GetBytes(timestamp.ToString()));

    string consumerKey = twitterConfiguration.ConsumerKey;
    string oAuthCallback = twitterConfiguration.OAuthCallback;

    string requestString =
        twitterConfiguration.EndpointUrl +
        OAuthRequestTokenRoute;

    string parameterString =
        $"oauth_callback={WebUtility.UrlEncode(twitterConfiguration.OAuthCallback)}&" +
        $"oauth_consumer_key={twitterConfiguration.ConsumerKey}&" +
        $"oauth_nonce={nonce}&" +
        $"oauth_signature_method=HMAC_SHA1&" +
        $"oauth_timestamp={timestamp}" +
        $"oauth_version=1.0";

    string signatureBaseString =
        "POST&" +
        WebUtility.UrlEncode(requestString) +
        "&" +
        WebUtility.UrlEncode(parameterString);

    string signingKey =
        twitterConfiguration.ConsumerSecret +
        "&" + twitterConfiguration.AccessTokenSecret;

    byte[] signatureBaseStringBytes = Encoding.ASCII.GetBytes(signatureBaseString);
    byte[] signingKeyBytes = Encoding.ASCII.GetBytes(signingKey);

    HMACSHA1 hmacSha1 = new HMACSHA1(signingKeyBytes);
    byte[] signature = hmacSha1.ComputeHash(signatureBaseStringBytes);

    string authenticationHeaderValue =
        $"oauth_nonce=\"{nonce}\", " +
        $"oauth_callback=\"{WebUtility.UrlEncode(twitterConfiguration.OAuthCallback)}\", " +
        $"oauth_signature_method=\"HMAC_SHA1\", " +
        $"oauth_timestamp=\"{timestamp}\", " +
        $"oauth_consumer_key=\"{twitterConfiguration.ConsumerKey}\", " +
        $"oauth_signature=\"{Convert.ToBase64String(signature)}\", " +
        $"oauth_version=\"1.0\"";

    HttpRequestMessage request = new HttpRequestMessage();
    request.Method = HttpMethod.Post;
    request.RequestUri = new Uri(
        baseUri: new Uri(twitterConfiguration.EndpointUrl),
        relativeUri: OAuthRequestTokenRoute);
    request.Content = new FormUrlEncodedContent(
        new Dictionary<string, string>() {
            { "oauth_callback", twitterConfiguration.OAuthCallback }
        });
    request.Headers.Authorization = new AuthenticationHeaderValue("OAuth",
        authenticationHeaderValue);

    HttpResponseMessage httpResponseMessage = await httpClient.SendAsync(request);

    if (httpResponseMessage.IsSuccessStatusCode)
    {
        return await httpResponseMessage.Content.ReadAsStringAsync();
    }
    else
    {
        return null;
    }
}

注意,我也尝试过从参数中删除回调URL,但是这没有用。我尝试了各种稍有不同的排列方式(将签名签名,在查询字符串中添加了回调URL,将其删除等),但此时我已经失去了尝试过但没有尝试过的内容(编码,引号等) )。

忽略我尚未将响应序列化为模型的事实,因为目标是首先命中成功状态代码!

我也有针对此方法的集成测试设置,并且不断收到400 Bad Request,而没有其他信息(这很有意义),但是绝对不能帮助调试。

[Fact]
public async Task TwitterHttpClientTests_GetOAuthRequestToken_GetsToken()
{
    var result = await twitterHttpClient.GetUserOAuthRequestToken();

    Assert.NotNull(result);
}

顺便说一句,我还有其他一些问题:

  1. 是否可以通过OAuth流程来验证用户的Twitter帐户?我问这个的原因是因为很难通过OAuth流程
  2. 在后端执行Twitter登录工作流程的第一步并将响应返回到前端是否安全?该响应将携带敏感令牌和令牌密钥。(如果我自己回答这个问题,我会说您必须这样做,否则您将不得不将应用程序密码硬编码到前端配置中,这更糟)。我问这个问题是因为自从我开始这样做以来,这一直在我的意识中,我有点担心。
  3. 是否有用于C#ASP.NET Core的OAuth帮助程序库,可以使此过程变得更容易?
zgncompass

经过数小时的文档阅读,我找到了答案。原来,我错过了指南中的一些小细节。

  1. oauth / request_token发出请求时,在对请求进行签名时,请勿使用访问令牌密钥(针对此特定请求)。另外,请参见签署请求指南“获取签名密钥”部分,并阅读最后几段。因此,签名密钥没有访问令牌密钥
  2. 您必须对每个键和值进行UrlEncode。您还必须UrlEncode授权标头。

如果您需要使用C#,我将在这里为您发布更新的代码。请注意,此代码不干净。您应该将OAuth功能分为其他一些类。这是我尝试使其工作的尝试。

public async Task<string> GetUserOAuthRequestToken()
{
    int timestamp = (Int32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds;
    string nonce = Convert.ToBase64String(Encoding.ASCII.GetBytes(timestamp.ToString()));

    string consumerKey = twitterConfiguration.ConsumerKey;
    string oAuthCallback = twitterConfiguration.OAuthCallback;

    string requestString =
        twitterConfiguration.EndpointUrl +
        OAuthRequestTokenRoute;

    string parameterString =
        $"oauth_callback={WebUtility.UrlEncode(twitterConfiguration.OAuthCallback)}&" +
        $"oauth_consumer_key={WebUtility.UrlEncode(twitterConfiguration.ConsumerKey)}&" +
        $"oauth_nonce={WebUtility.UrlEncode(nonce)}&" +
        $"oauth_signature_method={WebUtility.UrlEncode(OAuthSigningAlgorithm)}&" +
        $"oauth_timestamp={WebUtility.UrlEncode(timestamp.ToString())}&" +
        $"oauth_version={WebUtility.UrlEncode("1.0")}";

    string signatureBaseString =
        "POST&" +
        WebUtility.UrlEncode(requestString) +
        "&" +
        WebUtility.UrlEncode(parameterString);

    string signingKey =
        WebUtility.UrlEncode(twitterConfiguration.ConsumerSecret) +
        "&";

    byte[] signatureBaseStringBytes = Encoding.ASCII.GetBytes(signatureBaseString);
    byte[] signingKeyBytes = Encoding.ASCII.GetBytes(signingKey);

    HMACSHA1 hmacSha1 = new HMACSHA1(signingKeyBytes);
    byte[] signature = hmacSha1.ComputeHash(signatureBaseStringBytes);
    string base64Signature = Convert.ToBase64String(signature);

    string authenticationHeaderValue =
        $"oauth_nonce=\"{WebUtility.UrlEncode(nonce)}\", " +
        $"oauth_callback=\"{WebUtility.UrlEncode(twitterConfiguration.OAuthCallback)}\", " +
        $"oauth_signature_method=\"{WebUtility.UrlEncode(OAuthSigningAlgorithm)}\", " +
        $"oauth_timestamp=\"{WebUtility.UrlEncode(timestamp.ToString())}\", " +
        $"oauth_consumer_key=\"{WebUtility.UrlEncode(twitterConfiguration.ConsumerKey)}\", " +
        $"oauth_signature=\"{WebUtility.UrlEncode(base64Signature)}\", " +
        $"oauth_version=\"{WebUtility.UrlEncode("1.0")}\"";

    HttpRequestMessage request = new HttpRequestMessage();
    request.Method = HttpMethod.Post;
    request.RequestUri = new Uri(
        baseUri: new Uri(twitterConfiguration.EndpointUrl),
        relativeUri: OAuthRequestTokenRoute);
    request.Headers.Authorization = new AuthenticationHeaderValue("OAuth",
        authenticationHeaderValue);

    HttpResponseMessage httpResponseMessage = await httpClient.SendAsync(request);

    if (httpResponseMessage.IsSuccessStatusCode)
    {
        string response = await httpResponseMessage.Content.ReadAsStringAsync();
        return response;
    }
    else
    {
        return null;
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

处理 Twitter API 以验证 .NET Core 2.2 中的访问令牌

来自分类Dev

ASP.Net Core JWT令牌验证

来自分类Dev

Asp.Net Core未收到令牌

来自分类Dev

ASP.NET Core令牌获取异常

来自分类Dev

Twitter oAuth无效的请求令牌

来自分类Dev

覆盖ASP .NET Core中的请求对象

来自分类Dev

ASP.NET Core清除会话问题

来自分类Dev

未在Asp.Net Core中使用Swagger在请求中发送授权承载令牌

来自分类Dev

Twitter请求令牌OAuth 401错误

来自分类Dev

C#Twitter请求OAuth令牌

来自分类Dev

错误请求400从Flutter请求ASP.Net Core 3.0

来自分类Dev

ASP.NET Core中的承载令牌身份验证

来自分类Dev

如何更改asp.net core 1中的令牌响应?

来自分类Dev

ASP.NET Core中的AddOpenIdConnect和刷新令牌

来自分类Dev

承载令牌出现401错误-ASP.NET Core 3.1

来自分类Dev

在ASP.Net Core中检查令牌过期的性能方法

来自分类Dev

ASP.NET Core 数据保护长寿令牌

来自分类Dev

ASP.Net Core应用程序中的多种身份验证方法(Office 365或Facebook / Google / Twitter)

来自分类Dev

ASP.NET中的Twitter API集成

来自分类Dev

使用ASP.NET的Twitter TypeAhead

来自分类Dev

ASP.NET Core中的OAuth授权服务

来自分类Dev

本地OAuth令牌的ASP.NET生成

来自分类Dev

ASP.NET Core请求本地化选项

来自分类Dev

重新读取ASP.NET Core中的请求正文

来自分类Dev

如何在ASP .NET Core 3.1中设置请求超时

来自分类Dev

ASP.NET Core禁用请求缓冲(不是响应缓冲)

来自分类Dev

ASP.NET Core API请求的空对象检查

来自分类Dev

asp.net core mvc - 未经授权的ajax请求

来自分类Dev

放置请求期间的 ASP Net Core CORS 错误