Czy można dodać roszczenia do tokena na okaziciela, aby uzyskać dostęp do tych roszczeń w przyszłości? Jest to token na okaziciela, który jest wydawany przez API Web. Jest zawarty w adresie URL wyświetlany po przekierowaniu z procesu autoryzacji aplikacji Twitter.

Powodem, dla którego pytam, jest to, że próbuję zapisać Twitter Accessoked i AccessTokensecret jako dodatkowe roszczenia. Robię to, aby uzyskać dostęp do tych roszczeń, gdy uzyskam dostęp do metody Getuserinfo za pomocą tokena na okaziciela. Z tego, co mogę powiedzieć, nie jest to możliwe.

Wygląda na to, że może być musieli przechowywać je w SQL i pobrać je za pomocą nazwy użytkownika Twitter, gdy dostęp do Getuserinfo. Po uzyskaniu dostępu do GetuserInfo, dostaję nazwę użytkownika na Twitterze i UserId, ale nie mogę dostać akcesoria i AccessTokensecret. Być może móc przechowywać kontekst.Screenname, kontekst.Accessokoken i kontekstowy

Potrzebuję akcesoria i AccessTokensecret, więc mogę zadzwonić do tego punktu końcowego Twittera, aby uzyskać adres e-mail użytkownika.

https://api.twitter.com/1.1/account/verify_credentials.json.

Na tym etapie w tym etapie mój użytkownik nie jest zalogowany, a ich konto lokalne nie zostało utworzone. Próbuję uzyskać adres e-mail z Twittera, aby utworzyć swoje konto lokalne.

AKTUALIZACJA 1

Oto kilka kodu. Wzywam tę metodę od dostawcy w TwitterauthenticationOpTions w startup.auth tak jak. Jak widać, dodam roszczenia do kontekstu uwierzytelnionego.

Provider = new TwitterAuthProvider(), 

public class TwitterAuthProvider : TwitterAuthenticationProvider
{
    public string XmlSchemaString { get; private set; }

    public override Task Authenticated(TwitterAuthenticatedContext context)
    {
        context.Identity.AddClaim(new Claim("access_token", context.AccessToken, XmlSchemaString, "Twitter"));
        context.Identity.AddClaim(new Claim("access_token_secret", context.AccessTokenSecret, XmlSchemaString, "Twitter"));
        context.Identity.AddClaim(new Claim("user_name", context.ScreenName, XmlSchemaString, "Twitter"));
        context.Identity.AddClaim(new Claim("account_type", "Twitter", XmlSchemaString, "Twitter"));

        return Task.FromResult<object>(null);
    }

}

Każda pomoc jest bardzo doceniana. Z góry dziękuję!

0
Dumber_Texan2 27 luty 2019, 20:15

2 odpowiedzi

Najlepsza odpowiedź

Ok, w końcu dostałem to do pracy. Kluczem jest metodę externallogindata (patrz poniżej). Ta metoda zostaje wywołana, gdy aplikacja przekierowuje z powrotem z Twittera, Facebooka itp ... Zakładam, że jest to część https://api.yourdomain.com/signin-twitter i HTTPS: // API. yourdomain.com/signin-facebook itp. ... Wywołania zwrotne. Na podstawie tego, co mogę zebrać, zwróć nowe externallogindata dostaje akcesoria i AccessTokensecret. Następnie wezwano GetClaims. Jeśli AccapeBoked i AccessTokensecret nie są null, otrzymują ponowne dodanie jako roszczenia. Twierdzenia te można następnie uzyskać w metodzie GetuserInfo lub RegisterSternal za pomocą tej linii kodu.

ExternalLoginData externalLogin = ExternalLoginData.FromIdentity(User.Identity as ClaimsIdentity). 

Następnie możesz uzyskać dokładne wartości za pomocą tego kodu.

AccessToken = externalLogin != null ? externalLogin.AccessToken : null,
                    AccessTokenSecret = externalLogin != null ? externalLogin.AccessTokenSecret : null

Oto nowa metoda externallogindata.

private class ExternalLoginData
        {
            public string LoginProvider { get; set; }
            public string ProviderKey { get; set; }
            public string UserName { get; set; }
            public string AccessToken { get; set; }
            public string AccessTokenSecret { get; set; }


            public IList<Claim> GetClaims()
            {
                IList<Claim> claims = new List<Claim>();
                claims.Add(new Claim(ClaimTypes.NameIdentifier, ProviderKey, null, LoginProvider));

                if (UserName != null)
                {
                    claims.Add(new Claim(ClaimTypes.Name, UserName, null, LoginProvider));
                }

                if (AccessToken != null)
                {
                    claims.Add(new Claim("access_token", AccessToken, null, LoginProvider));
                }

                if (AccessTokenSecret != null)
                {
                    claims.Add(new Claim("access_token_secret", AccessTokenSecret, null, LoginProvider));
                }

                return claims;
            }

            public static ExternalLoginData FromIdentity(ClaimsIdentity identity)
            {
                if (identity == null)
                {
                    return null;
                }

                Claim providerKeyClaim = identity.FindFirst(ClaimTypes.NameIdentifier);

                if (providerKeyClaim == null || String.IsNullOrEmpty(providerKeyClaim.Issuer)
                    || String.IsNullOrEmpty(providerKeyClaim.Value))
                {
                    return null;
                }

                if (providerKeyClaim.Issuer == ClaimsIdentity.DefaultIssuer)
                {
                    return null;
                }

                return new ExternalLoginData
                {
                    LoginProvider = providerKeyClaim.Issuer,
                    ProviderKey = providerKeyClaim.Value,
                    UserName = identity.FindFirstValue(ClaimTypes.Name),
                    AccessToken = identity.Claims.FirstOrDefault(x => x.Type.Contains("access_token")).Value,
                    AccessTokenSecret = identity.Claims.FirstOrDefault(x => x.Type.Contains("access_token_secret")).Value,
                };
            }
        }

Następnie używam metody publicznej statycznej twitterdto twitterlogin, aby uzyskać adres e-mail z Twittera (patrz link poniżej).

https://stackoverflow.com/a/36356009/5360237.

Mam nadzieję, że pomoże to komuś innemu, ponieważ w ogóle nie jest udokumentowane. :)

0
Dumber_Texan2 1 marzec 2019, 18:47

Nie możesz zmienić żetonów wykonanych przez stronę trzecią.
Są podpisane z kluczem prywatnym i zatwierdzone podczas logowania.

Możesz umieścić identyfikator gospodarza między Twiiter Identity Prodiver a Twoimi aplikacjami. IdentityServer jest Open Source OpenID i OAuth 2.0 Server i pozwala na dyktowanie tego, jak należy obsługiwać tokeny i roszczenia. Ale to nie jest prosta rzecz. Wszystko zależy od tego, jak daleko chcesz iść na to rozwiązanie.

https://identityserver.io/

Z pewnością mogę to polecić!

0
Schwarzie2478 28 luty 2019, 16:06