• Digitaaliset tarvikkeet
  • Palvelin
  • Digitaalinen elämä
  • Tietosuojakäytäntö
  • Ota meihin yhteyttä
  1. Home
  2. Palvelin
  3. Todennus taustapalvelimella | Google-sisäänkirjautuminen verkkosivustoille

Todennus taustapalvelimella | Google-sisäänkirjautuminen verkkosivustoille

Rsdaa 14/01/2022 1047

如果您将 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 令牌后,您必须验证令牌的完整性。

Varmistaaksesi, että tunnus on kelvollinen, varmista, että seuraavat ehdot täyttyvät:

Google on allekirjoittanut tunnustunnuksen asianmukaisesti. Käytä Googlen julkisia avaimia (saatavilla JWK- tai PEM-muodossa) tunnuksen allekirjoituksen vahvistamiseen. Näitä näppäimiä pyöritetään säännöllisesti; tutki vastauksessa olevaa Cache-Control-otsikkoa määrittääksesi, milloin sinun pitäisi noutaa ne uudelleen. ID-tunnuksen aud-arvo on yhtä suuri kuin jokin sovelluksesi asiakastunnus. Tämä tarkistus on välttämätön, jotta haitalliselle sovellukselle annettuja tunnustunnuksia ei käytetä samaa käyttäjää koskevien tietojen käyttämiseen sovelluksesi taustapalvelimella. Tunnustunnuksen iss-arvo on sama kuin toaccounts.google.com tai https://accounts.google. .com.Tunnustunnuksen vanhenemisaika (exp) ei ole kulunut.Jos haluat rajoittaa pääsyn vain G Suite ‑verkkotunnuksesi jäseniin, varmista, että tunnustunnuksella on hd-vaatimus, joka vastaa GSuite-verkkotunnuksesi nimeä.

Sen sijaan, että kirjoittaisit oman koodin näiden vahvistusvaiheiden suorittamiseksi, suosittelemme Google API -asiakaskirjaston käyttöä alustallesi tai yleiskäyttöistä JWT-kirjastoa. Kehitystä ja virheenkorjausta varten voit soittaa tokeninfovalidation-päätepisteeseemme.

Google-sovellusliittymän asiakaskirjaston käyttäminen

Yhden Google-sovellusliittymän asiakaskirjaston (esim. Java, Node.js, PHP, Python) käyttäminen on suositeltu tapa vahvistaa Google ID -tunnukset tuotantoympäristössä.

Jos haluat vahvistaa tunnuksen Javassa, käytä GoogleIdTokenVerifier-objektia. Esimerkiksi:

tuonti 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 = uusi GoogleIdTokenVerifier.Builder(transport, jsonFactory)// Määritä taustajärjestelmää käyttävän sovelluksen CLIENT_ID:.setAudience(Collections.singletonList(CLIENT_ID))// Tai käytä useita asiakkaita backend://.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3)).build();// (Vastaanota idTokenString HTTPS POST:lla)GoogleIdToken idToken = verifier.verify(idTokenString);if (idTokenString);= null) {Token ! Payload payload = idToken.getPayload();// Tulosta käyttäjän tunnistemerkkijono userId = payload.getSubject();System.out.println("Käyttäjätunnus: " + userId);// Hae profiilitiedot payloadString-sähköpostista = payload.getEmail( );boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());merkkijonon nimi = (merkkijono) payload.get("nimi");merkkijono kuvaUrl = (merkkijono) payload.get("kuva");merkkijonon alue = ( Merkkijono) payload.get("locale");merkkijono familyName = (merkkijono) payload.get("perheen_nimi");merkkijono annettuName = (merkkijono) payload.get("given_name");// Käytä tai tallenna profiilitietoja// ...} else {System.out.println("Virheellinen ID-tunnus.");}

GoogleIdTokenVerifier.verify()-menetelmä vahvistaa JWT-signatuurin, aud-vaatimuksen, iss-vaatimuksen ja theexp-vaatimuksen.

Jos haluat rajoittaa pääsyn vain G Suite ‑verkkotunnuksesi jäseniin, vahvista myös hd-vaatimus tarkistamalla Payload.getHostedDomain()-metodin palauttama verkkotunnuksen nimi.

Jos haluat vahvistaa Node.js:n ID-tunnuksen, käytä Google Auth -kirjastoa Node.js:lle. Asenna kirjasto:

npm install google-auth-library --saveKutsu sitten verifyIdToken()-funktio. Esimerkki:const {OAuth2Client} = vaatia('google-auth-library');const client = uusi OAuth2Client(CLIENT_ID);async-funktio verify() {const lippu = odota asiakasta.verifyIdToken({idToken: tunnus,yleisö: CLIENT_ID ,// Määritä taustaa käyttävän sovelluksen CLIENT_ID// Tai, jos useat asiakkaat käyttävät taustaa://[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]});const payload = ticket.getPayload();const userid = payload[ 'sub'];// Jos pyynnössä määritettiin G Suite domain:// const domain = payload['hd'];}verify().catch(console.error);

VerifyIdToken-toiminto vahvistaa JWT-allekirjoituksen, aud-vaatimus, exp-vaatimus ja iss-vaatimus.

Jos haluat rajoittaa pääsyn vain G Suite ‑verkkotunnuksesi jäseniin, varmista myös, että hd-vaatimus vastaa G Suite ‑verkkotunnuksesi nimeä.

Jos haluat vahvistaa tunnuksen PHP:ssä, käytä Google API Client Library for PHP:tä. Asenna kirjasto (esimerkiksi Composerilla):

säveltäjä vaatii google/apiclientSitten kutsu verifyIdToken()-funktiota. Esimerkki:require_once 'vendor/autoload.php';// Hanki $id_token HTTPS:n kautta POST.$client = new Google_Client(['client_id' => $CLIENT_ID]);// Määritä sovelluksen CLIENT_ID, joka käyttää backend$payload = $client->verifyIdToken($id_token);if ($payload) {$userid = $payload['sub'];// Jos pyynnössä on määritetty G Suite -verkkotunnus://$domain = $payload[ 'hd'];} else {// Invalid ID token}

VerifyIdToken-toiminto vahvistaa JWT-allekirjoituksen, aud-vaatimuksen, exp-vaatimuksen ja iss-vaatimuksen.

Jos haluat rajoittaa pääsyn vain G Suite ‑verkkotunnuksesi jäseniin, varmista myös, että hd-vaatimus vastaa G Suite ‑verkkotunnuksesi nimeä.

Jos haluat vahvistaa tunnuksen Pythonissa, käytä verify_oauth2_tokenfunction-toimintoa. Esimerkiksi:

osoitteesta google.oauth2 import id_tokenfrom google.auth.transport import requests# (Vastaanota tunnus HTTPS POST:lla)# ...try:# Määritä taustaa käyttävän sovelluksen CLIENT_ID:idinfo = id_token.verify_oauth2_token(token, requests.Request (), CLIENT_ID)# Tai jos useat asiakkaat käyttävät taustapalvelinta:# idinfo = id_token.verify_oauth2_token(token, requests.Request())# jos idinfo['aud'] ei ole paikoissa [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]:# raise ValueError('Ei voitu vahvistaa yleisöä.')# Jos todennuspyyntö on peräisin G Suiten verkkotunnuksesta:# if idinfo['hd'] != GSUITE_DOMAIN_NAME:# raise ValueError('Väärä isännöity verkkotunnus.')# ID-tunnus on kelvollinen . Hanki käyttäjän Google-tilin tunnus dekoodatusta token.userid = idinfo['sub']paitsi ValueError:# Virheellinen tokenpass

Verify_oauth2_token-toiminto vahvistaa JWTsignatuurin, aud-vaatimuksen ja exp-vaatimuksen. Sinun on myös vahvistettava hdclaim (jos mahdollista) tutkimalla objektia, jonka verify_oauth2_token palauttaa. Jos useat asiakkaat käyttävät taustapalvelinta, tarkista myös aud-vaatimus manuaalisesti.

Tokeninfo-päätepisteen kutsuminen

Helppo tapa vahvistaa ID-tunnuksen allekirjoitus virheenkorjausta varten on käyttää tokeninfo-päätepistettä. Tämän päätepisteen kutsuminen sisältää ylimääräisen verkkopyynnön, joka suorittaa suurimman osan validoinnista puolestasi, kun testaat oikeaa validointia ja hyötykuorman purkamista omassa koodissasi. Se ei sovellu käytettäväksi tuotantokoodissa, koska pyynnöt voivat olla tukahdutettuja tai muuten alttiita ajoittaisille virheille.

Jos haluat vahvistaa ID-tunnuksen käyttämällä tokeninfo-päätepistettä, tee HTTPSPOST- tai GET-pyyntö päätepisteelle ja välitä tunnusmerkkisi theid_token-parametriin. Jos haluat esimerkiksi vahvistaa tunnuksen "XYZ123", tee seuraava GET-pyyntö:

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

Jos tunnus on allekirjoitettu oikein ja iss- ja expclaims-lauseilla on odotetut arvot, saat HTTP 200 -vastauksen, jossa runko sisältää JSON-muotoisen tunnuksen token väittää. Tässä on esimerkkivastaus:

{ // Nämä kuusi kenttää sisältyvät kaikkiin Google ID Tokeneihin. "iss": "https://accounts.google.com", "sub": "110169484474386276334", "azp": "1008719970978-hb24n2dstb40o45d4feuo2ukqmcc6381.contenud.9"07us"0google 78-hb24n2dstb40o45d4feuo2ukqmcc6381.apps .googleusercontent.com", "iat": "1433978353", "exp": "1433981953", // Nämä seitsemän kenttää sisällytetään vain, kun käyttäjä on myöntänyt sovellukselle "profiili" ja // "email" OAuth-alueet . "email": "testuser@gmail.com", "email_verified": "true", "name" : "Testauskäyttäjä", "kuva": "https://lh4.googleusercontent.com/-kYgzyAWpZzJ/ABCDEFGHI/AAAJKLMNOP /tIXL9Ir44LE/s99-c/photo.jpg", "given_name": "Test", "family_name": "User", "locale": "en"}Varoitus: Kun saat nämä väitteet, sinun on silti tarkistettava, että aud-vaatimus sisältää yhden sovelluksesi asiakastunnuksesta. Jos näin on, tunnus on sekä asiakkaallesi kelvollinen että tarkoitettu, ja voit turvallisesti noutaa ja käyttää käyttäjän yksilöllistä Google-tunnusta alivaatimuksesta.

Jos olet G Suite ‑asiakas, saatat olla kiinnostunut myös hdclaim-hakemuksesta. , joka osoittaa käyttäjän isännöidyn verkkotunnuksen. Tätä voidaan käyttää rajoittamaan pääsy resurssiin vain tiettyjen verkkotunnusten jäseniin. Tämän väitteen puuttuminen tarkoittaa, että käyttäjä ei kuulu G Suiten isännöimään verkkotunnukseen.

创建帐户或会话

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

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

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


PREV: Hyper-V:n virtuaalisuorittimet selitetty - Altaro

NEXT: Opas VPS vs Cloud Hosting: Viiden avaimen ymmärtäminen ...

Popular Articles

Hot Articles

Navigation Lists

Back to Top