• Дигитални аксесоари
  • сървър
  • Дигитален живот
  • Политика за поверителност
  • Свържете се с нас
  1. Home
  2. сървър
  3. Удостоверяване с бекенд сървър | Влизане в Google за уебсайтове

Удостоверяване с бекенд сървър | Влизане в Google за уебсайтове

Rsdaa 14/01/2022 1623

如果您将 Google Sign-In 用于与后端服务器通信的应用或网站,您可能需要识别服务器上当前登录的用户。为了安全地执行此操作,在用户成功登录后,使用 HTTPS 将用户的 ID 令牌发送到您的服务器。然后,在服务器端验证ID令牌的完整性,并使用令牌中包含的用户信息建立会话或创建新帐户。

警告:不接受普通的用户ID,如你可以用得到GoogleUser.getId() method ,您的后端服务器上。修改后的客户端应用程序可以将任意用户 ID 发送到您的服务器以模拟用户,因此您必须改为使用可验证的 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);

验证 ID 令牌的完整性

通过 HTTPS POST 收到 ID 令牌后,您必须验证令牌的完整性。

За да проверите дали токенът е валиден, уверете се, че са изпълнени следните критерии:

ID токенът е правилно подписан от Google. Използвайте публичните ключове на Google (достъпни във формат JWK или PEM), за да проверите подписа на токена. Тези ключове се сменят редовно; прегледайте заглавката Cache-Control в отговора, за да определите кога трябва да ги извлечете отново. Стойността на aud в ID токена е равна на един от идентификаторите на клиента на вашето приложение. Тази проверка е необходима, за да се предотврати използването на ID токени, издадени на злонамерено приложение, за достъп до данни за същия потребител на задния сървър на приложението Ви. Стойността на iss в ID токена е равна наaccounts.google.com или https://accounts.google .com.Времето на изтичане (exp) на ID токена не е изтекло.Ако искате да ограничите достъпа само до членове на вашия домейн G Suite, проверете дали ID токенът има hd иск, който съответства на името на вашия домейн GSuite.

Вместо да пишете свой собствен код, за да изпълните тези стъпки за проверка, силно препоръчваме да използвате клиентска библиотека на Google API за вашата платформа или JWT библиотека с общо предназначение. За разработка и отстраняване на грешки можете да се обадите на нашата крайна точка за проверка на информацията за токени.

Използване на клиентска библиотека на Google API

Използването на една от клиентските библиотеки на Google API (напр. Java,Node.js,PHP,Python) е препоръчителният начин за валидиране на токени за идентификатор на Google в производствена среда.

За да потвърдите ID токен в Java, използвайте обекта GoogleIdTokenVerifier. Например:

импортиране com.google.api.client.googleapis.auth.oauth2.GoogleIdToken;импортиране com.google.api.client.googleapis.auth.oauth2.GoogleIdToken.Payload;импортиране com.google.api.client.googleapis.auth.oauth2 .GoogleIdTokenVerifier;...GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory)// Посочете CLIENT_ID на приложението, което има достъп до бекенда:.setAudience(Collections.singletonList(CLIENT_ID))// Или, ако множество клиенти имат достъп до backend://.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3)).build();// (Получаване на idTokenString чрез HTTPS POST)GoogleIdToken idToken = verifier.verify(idTokenString);if (idToken != null) { Payload payload = idToken.getPayload();// Отпечатване на потребителски идентификаторString userId = payload.getSubject();System.out.println("Потребителски идентификатор: " + userId);// Получаване на информация за профила от payloadString email = payload.getEmail( );boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());String name = (String) payload.get("name");String pictureUrl = (String) payload.get("picture");String locale = ( String) payload.get("locale");String familyName = (String) payload.get("family_name");String givenName = (String) payload.get("given_name");// Използвайте или съхранявайте информация за профила// ...} else {System.out.println("Invalid ID token.");}

Методът GoogleIdTokenVerifier.verify() проверява JWTsignature, искането aud, искането iss и искането exp.

Ако искате да ограничите достъпа само до членовете на вашия домейн G Suite, проверете също hd искането, като проверите името на домейна, върнато от метода Payload.getHostedDomain().

За да потвърдите ID токен в Node.js, използвайте библиотеката за удостоверяване на Google за Node.js. Инсталирайте библиотеката:

npm инсталирайте google-auth-library --save След това извикайте функцията verifyIdToken(). Например: const {OAuth2Client} = require('google-auth-library');const client = new OAuth2Client(CLIENT_ID);async функция verify() {const билет = изчакване client.verifyIdToken({idToken: token,audience: CLIENT_ID ,// Посочете CLIENT_ID на приложението, което има достъп до бекенда// Или, ако множество клиенти имат достъп до бекенда://[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]});const payload = ticket.getPayload();const userid = payload[ 'sub'];// Ако заявката посочи домейн на G Suite:// const domain = payload['hd'];}verify().catch(console.error);

Функцията verifyIdToken проверява JWT подписа, aud иск, exp иск и iss иск.

Ако искате да ограничите достъпа само до членове на вашия домейн в G Suite, също така проверете дали hd искането съответства на името на вашия домейн в G Suite.

За да потвърдите ID токен в PHP, използвайте клиентската библиотека на API на Google за PHP. Инсталирайте библиотеката (например чрез Composer):

composer изисква google/apiclient След това извикайте функцията verifyIdToken(). Например:require_once 'vendor/autoload.php';// Вземете $id_token чрез HTTPS POST.$client = нов Google_Client(['client_id' => $CLIENT_ID]);// Посочете CLIENT_ID на приложението, което осъществява достъп до backend$payload = $client->verifyIdToken($id_token);if ($payload) {$userid = $payload['sub'];// Ако заявката посочи домейн на G Suite://$domain = $payload[ 'hd'];} else {// Невалиден ID token}

Функцията verifyIdToken проверява подписа на JWT, искането aud, искането exp и искането iss.

Ако искате да ограничите достъпа само до членове на вашия домейн в G Suite, също така проверете дали hd искането съответства на името на вашия домейн в G Suite.

За да потвърдите ID токен в Python, използвайте функцията verify_oauth2_token. Например:

from google.oauth2 import id_tokenfrom google.auth.transport import requests# (Получаване на токен чрез HTTPS POST)# ...try:# Посочете CLIENT_ID на приложението, което има достъп до бекенда:idinfo = id_token.verify_oauth2_token(token, requests.Request (), CLIENT_ID)# Или, ако множество клиенти имат достъп до бекенд сървъра:# idinfo = id_token.verify_oauth2_token(token, requests.Request())# ако idinfo['aud'] не е в [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:# raise ValueError('Не можа да се провери аудиторията.')# Ако заявката за удостоверяване е от домейн на G Suite:# if idinfo['hd'] != GSUITE_DOMAIN_NAME:# raise ValueError('Грешен хостван домейн.')# ID токенът е валиден . Вземете идентификационния номер на потребителския акаунт в Google от декодирания token.userid = idinfo['sub']except ValueError:# Invalid tokenpass

Функцията verify_oauth2_token проверява JWTsignature, твърдението aud и твърдението exp. Трябва също така да проверите hdclaim (ако е приложимо) чрез изследване на обекта, който verify_oauth2_token връща. Ако множество клиенти имат достъп до бекенд сървъра, проверете и ръчно искането за aud.

Извикване на крайната точка на tokeninfo

Лесен начин за валидиране на подпис на ID токен за отстраняване на грешки е използването на крайната точка на tokeninfo. Извикването на тази крайна точка включва допълнителна мрежова заявка, която извършва по-голямата част от валидирането вместо вас, докато тествате правилното валидиране и извличането на полезен товар във вашия собствен код. Не е подходящо за използване в производствен код, тъй като заявките могат да бъдат ограничени или по друг начин да бъдат предмет на периодични грешки.

За да потвърдите ID токен с помощта на крайната точка tokeninfo, направете HTTPSPOST или GET заявка към крайната точка и подайте своя ID токен в параметър theid_token. Например, за да потвърдите токена „XYZ123“, направете следната GET заявка:

https://oauth2.googleapis.com/tokeninfo?id_token=XYZ123

Ако токенът е правилно подписан и iss и expclaims имат очакваните стойности, ще получите HTTP 200 отговор, където тялото съдържа JSON-форматиран ID претенции за токени. Ето примерен отговор:

{ // Тези шест полета са включени във всички Google ID Tokens. "iss": "https://accounts.google.com", "sub": "110169484474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.apps.googleusercontent.com", "aud": "100871997097 8-hb24n2dstb40o45d4feuo2ukqmcc6381.apps .googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // Тези седем полета са включени само когато потребителят е предоставил OAuth обхватите "profile" и // "email" на приложението . "email": "testuser@gmail.com", "email_verified": "true", "name": "Тест потребител", "picture": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP /tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Тест", "family_name": "Потребител", "locale": "en"}Предупреждение: След като получите тези твърдения, все пак трябва да проверите дали aud искът съдържа един от клиентските идентификатори на приложението ви. Ако е така, тогава токенът е както валиден, така и предназначен за вашия клиент и можете безопасно да извлечете и използвате уникалния Google ID на потребителя от подзаявлението.

Ако сте клиент на G Suite, може също да се интересувате от hdclaim , което показва хоствания домейн на потребителя. Това може да се използва за ограничаване на достъпа до ресурс само до членове на определени домейни. Липсата на това твърдение показва, че потребителят не принадлежи към хостван домейн на G Suite.

创建帐户或会话

验证令牌后,检查用户是否已在您的用户数据库中。如果是,请为用户建立经过身份验证的会话。如果该用户尚未出现在您的用户数据库中,请根据 ID 令牌负载中的信息创建一个新的用户记录,并为该用户建立一个会话。当您在应用中检测到新创建的用户时,您可以提示用户提供您需要的任何其他个人资料信息。

使用跨帐户保护保护用户的帐户

当您依靠 Google 为用户登录时,您将自动受益于 Google 为保护用户数据而构建的所有安全功能和基础架构。但是,万一用户的 Google 帐户遭到入侵或发生其他一些重大安全事件,您的应用也可能容易受到攻击。为了更好地保护您的帐户从任何重大安全事件,使用跨帐户保护,从谷歌收到安全警报。收到这些事件后,您就可以了解用户 Google 帐户安全性的重要变化,然后您可以对您的服务采取措施以保护您的帐户。


PREV: Обяснени Hyper-V виртуални процесори - Altaro

NEXT: Ръководство за VPS срещу облачен хостинг: Разбиране на пет ключови ...

Popular Articles

Hot Articles

Navigation Lists

Back to Top