Federated Credential Management
Co je FedCM?
Federated Credential Management (FedCM) je webová technologie, která umožňuje bezpečné a rychlé přihlašování bez přesměrování. Uživatel si jednoduše vybere účet přímo v prohlížeči a přihlásí se jedním kliknutím. Přihlášené návštěvníky můžete spolehlivě identifikovat a díky efektivnějšímu cílení jim zobrazovat reklamu, která je více osloví. To vám umožňí potenciálně zvýšit výnosy z návštěvnosti.
Výhody FedCM
- Zjednodušuje přihlášení pomocí účtu u identity providera.
- Přihlášení se uživateli aktivně nabízí.
- Dokončení přihlášení je jedním kliknutím.
- Jde o funkci prohlížeče – unifikované, univerzální a spolehlivé řešení.
- Uživatel se přihlásí „na jeden klik“ a je tak větší šance, že vůbec přihlášení u vás na webu provede = získáte větší množství přihlášených uživatelů, se kterými můžete lépe pracovat.
Pokud máte zájem o Přihlášení přes Seznam s FedCM na vašem webu, musíte:
- mít k dispozici
ID klientaaOAuth tajemstvívaší služby, - pokud nemáte, zaregistrujte si službu v záložce Správa služeb,
- vložit JavaScriptový kód na své stránky a tím vyvolat FedCM dialog,
- po úspěšném dokončení FedCM převzít Seznamem poskytnutý krátkodobý
kóda následně s ním zažádat o uživatelská data, - zpracovat získaná uživatelská data a pomocí nich přihlásit nebo založit nový uživatelský účet,
- přihlášeného uživatele propojit s výdejem reklamy.
Podrobné informace o tom, jak FedCM funguje: FedCM API guide
Klientská část
K základnímu zprovoznění FedCM můžete použít JavaScript uvedený v ukázce níže. Pokud je uživatel v prohlížeči přihlášen k účtu Seznamu (prostřednictvím svého e–mailu anebo telefonního čísla) a zároveň na stránce zavoláte níže uvedený JavaScript, zobrazí se uživateli okno s dotazem, jestli chce být přes Seznam přihlášen i na vašem webu.
Vyvolání FedCM dialogu je tedy pod vaší kontrolou. Abyste předešli zbytečnému zobrazování dialogu u již přihlášených uživatelů, musíte se řídit aktuálním stavem:
- uživatel na vašem webu není přihlášen – spusťte FedCM (zavolejte uvedený JS kód), které se pokusí uživatele přihlásit automaticky (zobrazí mu informační dialog); po úspěšném dokončení procesu bude vašemu webu předán autorizační token, který vyžijete při získání dat uživatele,
- uživatel na vašem webu už přihlášen je – FedCM nevolejte, abyste uživateli přihlašovací dialog nezobrazovali zbytečně.
Přihlášením se zde rozumí přihlášení přes účet Seznamu. Případné uživatelské účty registrované dříve pouze na vašem webu je třeba sloučit s přihlášením přes Seznam (viz kapitola Uložení uživatele).
Ukázka JavaScript kódu
// neni podporovano ve vsech prohlizecich
if ("IdentityCredential" in window) {
async function getCredential() {
try {
const credential = await navigator.credentials.get({
identity: {
context: "signin",
providers: [{
// nemenna adresa konf. souboru
configURL: "https://login.szn.cz/fedcm/config.json",
// vase client_id
clientId: "5257140..."
}]
}
});
// naplneni promenne v pripade uspesneho (odsouhlaseneho) FedCM dialogu
const code = credential.token;
// predani kodu vasi serverove casti
// ( . . . )
} catch (e) {}
}
getCredential();
}
Jako hodnotu clientId použijte odpovídající řetězec (client_id), který jste získali v předchozí části. Kód je připravený jen pro jednu přihlašovací službu (Seznam) a je funkční v nejrozšířenějších prohlížečích – Google Chrome, Microsoft Edge, Opera. Pokud chcete, aby si uživatel mohl vybrat, jestli se přihlásí přes svůj účet u Seznamu, nebo například přes svůj Google účet, musíte do kódu přidat oba poskytovatele. Podpora více poskytovatelů je v prohlížeči Chrome dostupná od verze 136 výše.
Do pole providers stačí přidat obě služby a jejich ID klienta jako samostatné objekty. Definice může vypadat například takto:
providers: [{
configURL: "https://login.szn.cz/fedcm/config.json",
clientId: "5257140..."
}, {
configURL: "https://accounts.google.com/gsi/fedcm.json",
clientId: "5902040..."
}]
Podpora více poskytovatelů v poli providers je dostupná v prohlížeči Chrome od verze 136 a novější.
Serverová část
Využitím vašeho client_id i client_secret získáte access_token s jehož pomocí následně i data o uživateli.
Příklad v jazyce Python
# nejprve ziskate access_token
res = requests.post("https://login.szn.cz/api/v1/oauth/token", json={
"grant_type": "authorization_code",
"code": code, # kod ziskany v klientske casti (pomoci FedCM)
"client_id": "5257140...", # vase client_id
"client_secret": "e9d4c83..." # vase client_secret
})
access_token = res.json().get("access_token")
token_type = res.json().get("token_type")
# ziskani uzivatelskych dat
headers = {"Authorization": f"{token_type} {access_token}"}
user_data = requests.get("https://login.szn.cz/api/v1/user", headers=headers)
Příklad v jazyce PHP
<?php
// 1) Získání access_tokenu
$auth_code = "VÁŠ_AUTH_CODE"; // kód získaný z klientské části (pomocí FedCM)
$client_id = "5257140..."; // vaše client_id
$client_secret = "e9d4c83..."; // vaše client_secret
$token_url = "https://login.szn.cz/api/v1/oauth/token";
$data = [
"grant_type" => "authorization_code",
"code" => $auth_code,
"client_id" => $client_id,
"client_secret" => $client_secret
];
// cURL požadavek na získání access tokenu
$ch = curl_init($token_url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, ["Content-Type: application/json"]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);
$res = json_decode($response, true);
$access_token = $res["access_token"] ?? null;
$token_type = $res["token_type"] ?? null;
// 2) Získání uživatelských dat
if ($access_token && $token_type) {
$user_url = "https://login.szn.cz/api/v1/user";
$ch = curl_init($user_url);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"Authorization: {$token_type} {$access_token}"
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$user_response = curl_exec($ch);
curl_close($ch);
$user_data = json_decode($user_response, true);
print_r($user_data);
} else {
echo "Nepodařilo se získat access_token.\n";
}
Podrobný popis endpointu /oauth/token a jeho odpovědi najdete v sekci Přihlášení přes Seznam.
Pokud kvůli dřívější implementaci Přihlášení přes Seznam posíláte na endpoint /oauth/token i redirect_uri, mějte na paměti, že v rámci FedCM se nepoužívá, proto redirect_uri v tomto případě neposílejte.
Jako odpověď na požadavek odeslaný na https://login.szn.cz/api/v1/user (dále jen „Seznam User API“) dostanete JSON objekt s následujícími údaji o uživateli:
Dostupná uživatelská data v odpovědi
accountDisplayName
advert_user_id
email
firstname
lastname
oauth_user_id
Uložení uživatele
Data získaná jako odpověď ze Seznam User API uložte k záznamu daného uživatele do vaší databáze. Pokud se záznam odpovídající uživateli (za základě ověření, například pomocí e-mailu) ve vaší databázi nenachází, vytvoříte jej s využitím výše uvedených dat.
Pokud záznam uživatele ve vaší databázi již existuje a data ze Seznam User API obsahuje, je možné rovnou pokračovat přihlášením uživatele.
Přihlášení uživatele
Uživatele přihlásíte standardním způsobem, který na svém webu využíváte – vytvoříte mu session nebo vydáte vlastní přístupový token.
Příklad v jazyce PHP demonstruje ověření existence uživatele v databázi CMS WordPress na základě jeho e-mailu následované přihlášením. Pokud záznam uživatele v databázi neexistuje, je před přihlášením vytvořen:
Příklad v jazyce PHP pro WordPress
// Najdi existujícího WP uživatele
$user = get_user_by('email', $email);
if (!$user) {
// Pokud neexistuje, vytvoř
$user_id = wp_create_user($email, wp_generate_password(), $email);
wp_update_user([
'ID' => $user_id,
'display_name' => $name
]);
$user = get_user_by('id', $user_id);
}
// Přihlaš uživatele
wp_set_current_user($user->ID);
wp_set_auth_cookie($user->ID);
Pokud se uživatel následně odhlásí, je potřeba jeho session ukončit a chovat se k němu jako k neznámému uživateli, tedy nevyužívat žádné jeho osobní údaje.
Po odhlášení a znovunačtení stránky je ovšem splněna podmínka pro zobrazení FedCM dialogu a automatické přihlášení, což je v dané situaci nežádoucí. Toto chování lze dočasně vypnout tak, že ihned po odhlášení uživatele zavoláte JS navigator.credentials.preventSilentAccess();Tím bude automatické přihlášení na krátký časový úsek vypnuto v souladu s oficiální Google dokumentací.
Propojení přihlášeného uživatele s výdejem reklamy
Jak propojit přihlášeného uživatele s výdejem cílené reklamy se dozvíte >ZDE<.
Poznámky
- Pokud se v prohlížeči zatím žádní uživatelé nepřihlásili, pak nebude FedCM dialog zobrazen.
- Pokud se v minulosti přihlásili uživatelé a momentálně jsou odhlášení - FedCM zobrazí jednou dialog s možností otevřít pop-up s přihlášením.
- Pokud uživatel dialog zavře (kliknutím na křížek), FedCM se zablokuje a uživatel ho může odblokovat ručně v nastavení prohlížeče nebo musí počkat, než ho prohlížeč po nějaké době znovu povolí.