如果您将 Google Sign-In 用于与后端服务器通信的应用或网站,您可能需要识别服务器上当前登录的用户。为了安全地执行此操作,在用户成功登录后,使用 HTTPS 将用户的 ID 令牌发送到您的服务器。然后,在服务器端验证ID令牌的完整性,并使用令牌中包含的用户信息建立会话或创建新帐户。
警告:不接受普通的用户ID,如你可以用得到GoogleUser.getId() method ,您的后端服务器上。修改后的客户端应用程序可以将任意用户 ID 发送到您的服务器以模拟用户,因此您必须改为使用可验证的 ID 令牌来安全地获取服务器端登录用户的用户 ID。用户成功登录后,获取用户的 ID 令牌:
function onSignIn(googleUser) {var id_token = googleUser.getAuthResponse().id_token;...}然后,使用 HTTPS POST 请求将 ID 令牌发送到您的服务器:
var xhr = new XMLHttpRequest();xhr.open('POST', 'https://yourbackend.example.com/tokensignin');xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');xhr.onload = function() {console.log('Signed in as: ' + xhr.responseText);};xhr.send('idtoken=' + id_token);通过 HTTPS POST 收到 ID 令牌后,您必须验证令牌的完整性。
Chcete-li ověřit, že je token platný, ujistěte se, že jsou splněna následující kritéria:
ID token je řádně podepsán společností Google. K ověření podpisu tokenu použijte veřejné klíče Google (dostupné ve formátu JWK nebo PEM). Tyto klávesy se pravidelně otáčejí; prozkoumejte hlavičku Cache-Control v odpovědi a určete, kdy byste je měli znovu načíst. Hodnota aud v tokenu ID se rovná jednomu z ID klienta vaší aplikace. Tato kontrola je nezbytná, aby se zabránilo použití tokenů ID vydaných pro škodlivou aplikaci k přístupu k datům o stejném uživateli na backendovém serveru vaší aplikace. Hodnota iss v tokenu ID se rovná accounts.google.com nebo https://accounts.google .com. Čas vypršení platnosti (exp) tokenu ID neuplynul. Pokud chcete omezit přístup pouze na členy vaší domény G Suite, ověřte, zda má token ID nárok hd, který odpovídá názvu vaší domény G Suite.Spíše než psaní vlastního kódu k provedení těchto ověřovacích kroků důrazně doporučujeme použít klientskou knihovnu Google API pro vaši platformu nebo univerzální knihovnu JWT. Pro vývoj a ladění můžete zavolat náš koncový bod pro ověření tokenu.
Doporučeným způsobem ověření tokenů Google ID v produkčním prostředí je použití jedné z klientských knihoven Google API (např. Java, Node.js, PHP, Python).
K ověření tokenu ID v jazyce Java použijte objekt GoogleIdTokenVerifier. Například:
import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;import com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;import com.google.api.client.googleapis.auth.oauth2 .GoogleIdTokenVerifier;...GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)// Zadejte CLIENT_ID aplikace, která přistupuje k backendu:.setAudience(Collections.singletonList(CLIENT_ID))// Nebo backend://.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3)).build();// (Příjem idTokenString pomocí HTTPS POST)GoogleIdToken idToken = verifier.verify(idTokenString);=if (idllToken) ! Payload payload = idToken.getPayload();// Tisk identifikátoru uživateleString userId = payload.getSubject();System.out.println("ID uživatele: " + userId);// Získejte informace o profilu z payloadString email = payload.getEmail( );boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());String name = (String) payload.get("name");String pictureUrl = (String) payload.get("obrázek");String locale = ( String) payload.get("locale");String familyName = (String) payload.get("family_name");String givenName = (String) payload.get("given_name");// Použití nebo uložení informací o profilu// ...} else {System.out.println("Neplatný token ID.");}Metoda GoogleIdTokenVerifier.verify() ověřuje podpis JWT, nárok na aud, nárok na iss a nárok na exp.
Pokud chcete omezit přístup pouze na členy vaší domény G Suite, ověřte také nárok na hd kontrolou názvu domény vráceného metodou Payload.getHostedDomain().
Chcete-li ověřit token ID v Node.js, použijte knihovnu Google Auth pro Node.js. Nainstalujte knihovnu:
npm install google-auth-library --savePotom zavolejte funkcioverIdToken(). Například:const {OAuth2Client} = require('google-auth-library');const client = new OAuth2Client(CLIENT_ID);asynchronní funkce ověření() {const ticket = wait client.verifyIdToken({idToken: token,audience: CLIENT_ID ,// Zadejte CLIENT_ID aplikace, která přistupuje k backendu// Nebo, pokud k backendu přistupuje více klientů://[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]});const payload = ticket.getPayload();const userid = payload[ 'sub'];// Pokud je v požadavku uvedena doména G Suite:// const domain = payload['hd'];}verify().catch(console.error);Funkce ověřitIdToken ověřuje podpis JWT, aud claim, exp claim a iss claim.
Pokud chcete omezit přístup pouze na členy vaší domény G Suite, ověřte také, že nárok na hd odpovídá názvu vaší domény G Suite.
Chcete-li ověřit token ID v PHP, použijte klientskou knihovnu Google API pro PHP. Nainstalujte knihovnu (například pomocí Composer):
skladatel vyžadovat google/apiclientPoté zavolejte funkci ověřeníIdToken(). Například:require_once 'vendor/autoload.php';// Získejte $id_token prostřednictvím HTTPS POST.$client = new Google_Client(['client_id' => $CLIENT_ID]);// Zadejte CLIENT_ID aplikace, která přistupuje backend$payload = $client->verifyIdToken($id_token);if ($payload) {$userid = $payload['sub'];// Pokud je v požadavku uvedena doména G Suite://$domain = $payload[ 'hd'];} else {// Neplatný token ID}Funkce ověřitIdToken ověřuje podpis JWT, nárok na aud, nárok na exp a nárok na iss.
Pokud chcete omezit přístup pouze na členy vaší domény G Suite, ověřte také, že nárok na hd odpovídá názvu vaší domény G Suite.
K ověření tokenu ID v Pythonu použijte funkci theverify_oauth2_token. Například:
from google.oauth2 import id_tokenfrom google.auth.transport import requirements# (Přijmout token pomocí HTTPS POST)# ...try:# Zadejte CLIENT_ID aplikace, která přistupuje k backendu:idinfo = id_token.verify_oauth2_token(token, request.Request (), CLIENT_ID)# Nebo, pokud k backendovému serveru přistupuje více klientů:# idinfo = id_token.verify_oauth2_token(token, request.Request())# pokud idinfo['aud'] není v [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:# raise ValueError('Nelze ověřit publikum.')# Pokud žádost o ověření pochází z domény G Suite:# if idinfo['hd'] != GSUITE_DOMAIN_NAME:# raise ValueError('Chybná hostovaná doména.')# ID token je platný . Získejte ID účtu Google uživatele z dekódovaného token.userid = idinfo['sub']s výjimkou ValueError:# Neplatný tokenpassFunkce ověření_oauth2_token ověřuje podpis JWT, nárok na aud a nárok na výraz. Musíte také ověřit hdclaim (pokud je to možné) prozkoumáním objektu, který vrací verify_oauth2_token. Pokud k backendovému serveru přistupuje více klientů, ověřte požadavek aud také ručně.
Snadný způsob, jak ověřit podpis tokenu ID pro ladění, je použít koncový bod tokeninfo. Volání tohoto koncového bodu zahrnuje další síťový požadavek, který za vás provede většinu ověření, zatímco testujete správnou validaci a extrakci datové zátěže ve vašem vlastním kódu. Není vhodný pro použití v produkčním kódu, protože požadavky mohou být omezeny nebo jinak vystaveny občasným chybám.
Chcete-li ověřit token ID pomocí koncového bodu tokeninfo, odešlete na koncový bod požadavek HTTPSPOST nebo GET a předejte svůj token ID v parametru theid_token. Chcete-li například ověřit token „XYZ123“, proveďte následující požadavek GET:
https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123Pokud je token správně podepsán a iss a exclaims mají očekávané hodnoty, dostanete odpověď HTTP 200, kde tělo obsahuje ID ve formátu JSON nároky na tokeny. Zde je příklad odpovědi:
{ // Těchto šest polí je zahrnuto ve všech tokenech Google ID. "iss": "https://accounts.google.com", "sub": "1101694844474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.987191contents.com",971googleuser b24n2dstb40o45d4feuo2ukqmcc6381.apps .googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // Těchto sedm polí je zahrnuto pouze v případě, že uživatel aplikaci udělil rozsahy OAuth "profil" a // "e-mail" . "email": "testuser@gmail.com", "email_verified": "true", "name" : "Testovací uživatel", "obrázek": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP /tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Test", "family_name": "Uživatel", "locale": "en"}Upozornění: Jakmile získáte tyto nároky, stále musíte zkontrolovat, zda nárok na aud obsahuje jedno z ID klienta vaší aplikace. Pokud ano, pak je token platný i určený pro vašeho klienta a můžete bezpečně načíst a použít jedinečné Google ID uživatele z podnároku.Pokud jste zákazníkem G Suite, mohl by vás zajímat také hdclaim , který označuje hostovanou doménu uživatele. To lze použít k omezení přístupu ke zdroji pouze členům určitých domén. Neexistence tohoto tvrzení znamená, že uživatel nepatří do hostované domény G Suite.
验证令牌后,检查用户是否已在您的用户数据库中。如果是,请为用户建立经过身份验证的会话。如果该用户尚未出现在您的用户数据库中,请根据 ID 令牌负载中的信息创建一个新的用户记录,并为该用户建立一个会话。当您在应用中检测到新创建的用户时,您可以提示用户提供您需要的任何其他个人资料信息。
当您依靠 Google 为用户登录时,您将自动受益于 Google 为保护用户数据而构建的所有安全功能和基础架构。但是,万一用户的 Google 帐户遭到入侵或发生其他一些重大安全事件,您的应用也可能容易受到攻击。为了更好地保护您的帐户从任何重大安全事件,使用跨帐户保护,从谷歌收到安全警报。收到这些事件后,您就可以了解用户 Google 帐户安全性的重要变化,然后您可以对您的服务采取措施以保护您的帐户。
PREV: Vysvětlení virtuálních procesorů Hyper-V - Altaro
NEXT: Průvodce VPS vs Cloud Hosting: Pochopení pěti klíčových ...