ASP.NET Core aplikace s Google přihlašováním přestanou fungovat

Tomáš Jecha, MVP, MCSD       03.02.2019       ASP.NET MVC, Bezpečnost, .NET, .NET Core, ASP.NET Core       2319 zobrazení

Google se svou sociální sítí Google+ nebyl příliš úspěšný a oznámil její uzavření pro běžné uživatele. S tím je spojené vypnutí Google+ API od 7. března 2019oficiální vyjádření zde.

Administrátory zasažených aplikací, kteří volají zasažené API, kontaktoval emailem na konci ledna:

[Action Required] Google+ APIs and OAuth requests are being shutdown on March 7, 2019

Hello Google+ Developer,

The email below contains your most recent usage of Google+ APIs. Note: It includes Google+ OAuth scope requests, which are also affected by the Google+ shutdown. A prior email sent to active API callers did not include information about OAuth requests. One final reminder email will be sent in February to users who still have active API or OAuth request activity.

Technicky vypnutí Google+ API znamená, že přestanou být dostupná API pod adresou začínajících https://www.googleapis.com/plus/.

Jak vypnutí Google+ API ovlivní ASP.NET Core aplikace?

Pokud vaše webová aplikace dovoluje login pomocí Google účtu, je možné, že vám od března přestane fungovat.

Možná používáte následující metody pro konfiguraci autentifikace.

services.AddAuthentication().AddGoogle(o => { …. })

Pojďme se podívat, co se v aplikaci při přihlášení v takovém případě děje.

  1. Uživatel si zvolí přihlášení pomocí Google účtu a je přesměrován na login formuláře Googlu – nejčastěji po zavolání metody ExternalLoginSignInAsync
  2. Na login formuláři Googlu se uživatel ověří (typicky emailem a heslem) a vrací se zpět na váš web společně s ověřovacím tokenem
  3. Aby vaše aplikace takovému uživateli věřila, vezme ověřovací token a provolá s ním Google API /oauth2/v4/token – pokud byl v pořádku, získává naše aplikace access_token pro přístup k dalším API
  4. Dále vaše aplikace kontaktuje API /plus/v1/people/me a získává základní informace o uživateli – může to být email, jméno, profilový obrázek apod.
  5. Tyto údaje pak získáme z externí identity voláním GetExternalLoginInfoAsync

Z nástroje Fiddler jsou obě volání z kroků 3 a 4 vidět:

image

Problémový je zde krok číslo 4, kdy defaultní implementace volá k zjištění informací o uživateli rušené Google+ API /plus/v1/people/me. Po vypnutí tak přestane přihlášení fungovat.

Simulace vypnutí Google+ API

Vypnutí API si můžete nasimulovat pomocí těchto pravidel do nástroje Fiddler – způsobí, že při volání Google+ API bude server vracet chybu 404.

image

Jak problém vyřešit a přejít na Google SignIn API?

Pro většinu scénářů je řešení poměrně jednoduché. Stačí využít pro získání údajů jiné API, konkrétně /oauth2/v2/userinfo. Oba endpointy vrací JSON a autentizace probíhá pomocí access_tokenu. Vrácené údaje jsou vesměs stejné, pouze formát je trochu jiný.

Oprava záleží na verzi prostředí, které používáte. Vyjádření Microsoftu naleznete zde.

Migrace pro .NET Framework a OWIN

Oprava by měla být v balíku Microsoft.Owin.Security.Google od verze 4.0.1

Alternativně lze aplikovat fix pomocí kódu zde.

Migrace pro .NET Core 1

Sám jsem zatím nezkoušel a nehledal. Microsoft neplánuje vydat oficiální fix. Pokud máte informace nebo opravu, pošlete mi ji a budu článek aktualizovat.

Migrace pro .NET Core 2+

Změnu lze zapsat snadno konfiguračně. Následující kód mění adresu endpointu pro zjištění detailů o uživateli a mění chápání návratové hodnoty, aby fungoval s novým formátem.

services.AddAuthentication()
    .AddCookie()
    .AddGoogle(o =>
    {
        o.ClientId = Configuration["Authentication:Google:ClientId"];
        o.ClientSecret = Configuration["Authentication:Google:ClientSecret"];
        o.UserInformationEndpoint = "https://www.googleapis.com/oauth2/v2/userinfo";
        o.ClaimActions.Clear();
        o.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, "id");
        o.ClaimActions.MapJsonKey(ClaimTypes.Name, "name");
        o.ClaimActions.MapJsonKey(ClaimTypes.GivenName, "given_name");
        o.ClaimActions.MapJsonKey(ClaimTypes.Surname, "family_name");
        o.ClaimActions.MapJsonKey("urn:google:profile", "link");
        o.ClaimActions.MapJsonKey(ClaimTypes.Email, "email");
    });

Po nasazení konfigurace volání vypadá správně.

image

Do dalších verzí bude připraven fix na úrovni defaultních hodnot od verze .NET Core 2.1 a vyšší, takže tato konfigurace nebude třeba. Fix by měl vyjít v průběhu února 2019.

 

hodnocení článku

0       Hodnotit mohou jen registrované uživatelé.

 

Nový příspěvek

 

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.

Nyní zakládáte pod článkem nové diskusní vlákno.
Pokud chcete reagovat na jiný příspěvek, klikněte na tlačítko "Odpovědět" u některého diskusního příspěvku.

Nyní odpovídáte na příspěvek pod článkem. Nebo chcete raději založit nové vlákno?

 

  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

Příspěvky zaslané pod tento článek se neobjeví hned, ale až po schválení administrátorem.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback