【问题标题】:mvc.net get profile info from twittermvc.net 从 twitter 获取个人资料信息
【发布时间】:2019-09-14 10:04:11
【问题描述】:

在使用标准 mvc.net 外部身份验证进行身份验证后,我正在尝试从 Twitter 检索个人资料信息。

我可以使用位于 ExternalLoginCallback 函数中的以下代码(需要安装 Facebook SDK)为 facebook 执行此操作。

 if (string.Equals(loginInfo.Login.LoginProvider, "facebook", StringComparison.CurrentCultureIgnoreCase))
        {
            var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
            var access_token = identity.FindFirstValue("FacebookAccessToken");
            var fb = new FacebookClient(access_token);

            // you need to specify all the fields that you want to get back
            dynamic myInfo = fb.Get("/me?fields=email,first_name,last_name");
            email = myInfo.email;
            firstName = myInfo.first_name;
            lastName = myInfo.last_name;
        }

我正在寻找一个 twitter 等价物。

TIA

【问题讨论】:

  • @Mate 感谢链接。已按照建议安装了 TweetinviAPI,但很难找到复制上面 facebook 示例所需的代码。对 Twitter 进行了更深入的研究后,我认为我能希望的最好的就是电子邮件地址,但这对我来说仍然是一个胜利。 :)
  • 太棒了!我很高兴帮助了你。如果您需要回调的“公共” url,请使用 ngrok (ngrok.com),这是最好的工具。此外,您可以将自己的答案标记为已接受。

标签: c# .net asp.net-mvc api twitter


【解决方案1】:

所以这就是我所做的主要基于此

Obtain twitter access token asp.net identity

首先,我按照上面的@Mate 建议安装了TwitterinviAPI nuget 包。

其次,我更新了 StartUp.Auth.cs 中 ConfigureAuth 的 twitter 部分以包含一个“提供者”

app.UseTwitterAuthentication(new TwitterAuthenticationOptions()
        {
            ConsumerKey = ConfigurationManager.AppSettings["TwitterConsumerKey"],
            ConsumerSecret = ConfigurationManager.AppSettings["TwitterConsumerSecret"],
            Provider = new LinqToTwitterAuthenticationProvider(),
            BackchannelCertificateValidator = new Microsoft.Owin.Security.CertificateSubjectKeyIdentifierValidator(new[]
                {
                   "A5EF0B11CEC04103A34A659048B21CE0572D7D47", // VeriSign Class 3 Secure Server CA - G2
                   "0D445C165344C1827E1D20AB25F40163D8BE79A5", // VeriSign Class 3 Secure Server CA - G3
                   "7FD365A7C2DDECBBF03009F34339FA02AF333133", // VeriSign Class 3 Public Primary Certification Authority - G5
                   "39A55D933676616E73A761DFA16A7E59CDE66FAD", // Symantec Class 3 Secure Server CA - G4
                   "‎add53f6680fe66e383cbac3e60922e3b4c412bed", // Symantec Class 3 EV SSL CA - G3
                   "4eb6d578499b1ccf5f581ead56be3d9b6744a5e5", // VeriSign Class 3 Primary CA - G5
                   "5168FF90AF0207753CCCD9656462A212B859723B", // DigiCert SHA2 High Assurance Server C‎A 
                   "B13EC36903F8BF4701D498261A0802EF63642BC3" // DigiCert High Assurance EV Root CA
                 }),
        });

第三,我将 LinqToTwitterAuthenticationProvider 类添加到 Model/IdentityModels 中(尽管您可以将此代码放在任何您喜欢的地方)

public class LinqToTwitterAuthenticationProvider : TwitterAuthenticationProvider
{
    public const string AccessToken = "TwitterAccessToken";
    public const string AccessTokenSecret = "TwitterAccessTokenSecret";

    public override Task Authenticated(TwitterAuthenticatedContext context)
    {
        context.Identity.AddClaims(
            new List<Claim>
            {
            new Claim(AccessToken, context.AccessToken),
            new Claim(AccessTokenSecret, context.AccessTokenSecret)
            });

        return base.Authenticated(context);
    }

最后,我使用以下代码更新了 Accounts 控制器中的 ExternalLoginCallback 以从 twitter 获取用户详细信息

  else if (string.Equals(loginInfo.Login.LoginProvider, "twitter", StringComparison.CurrentCultureIgnoreCase))
        {
            // Generate credentials that we want to use
            var identity = AuthenticationManager.GetExternalIdentity(DefaultAuthenticationTypes.ExternalCookie);
            var access_token = identity.FindFirstValue(LinqToTwitterAuthenticationProvider.AccessToken);
            var access_token_secret = identity.FindFirstValue(LinqToTwitterAuthenticationProvider.AccessTokenSecret);
            var creds = new TwitterCredentials(ConfigurationManager.AppSettings["TwitterConsumerKey"], ConfigurationManager.AppSettings["TwitterConsumerSecret"],access_token, access_token_secret);
            var authenticatedUser = Tweetinvi.User.GetAuthenticatedUser(creds);
            email = authenticatedUser.Email;
            firstName = authenticatedUser.Name.Substring(0, authenticatedUser.Name.IndexOf(' '));
            lastName = authenticatedUser.Name.Substring(authenticatedUser.Name.IndexOf(' ') + 1);

        }

有一个小小的 GOTCHYA。即使在这一切之后,电子邮件仍然是空的。问题出在我的 Twitter 应用程序设置中,我没有提供隐私或 ToS URL,因此无法检查权限选项卡下的选项以请求用户电子邮件。仅供参考。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2018-08-20
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多