หลังจาก Google ส่งโทเค็นระบุตัวตนแล้ว ระบบจะส่งโทเค็นดังกล่าวผ่านคำขอ HTTP POST
ที่มีชื่อพารามิเตอร์ credential
ไปยังปลายทางการเข้าสู่ระบบ
ต่อไปนี้เป็นตัวอย่างในภาษา Python ที่แสดงขั้นตอนปกติในการตรวจสอบและใช้โทเค็นระบุตัวตน
ยืนยันโทเค็น Cross-Site Request Forgery (CSRF) เมื่อคุณส่งข้อมูลเข้าสู่ระบบไปยังปลายทางการเข้าสู่ระบบ เราจะใช้รูปแบบการส่งคุกกี้ 2 ครั้งเพื่อป้องกันการโจมตี CSRF เราจะสร้างโทเค็นก่อนการส่งแต่ละครั้ง จากนั้นระบบจะใส่โทเค็นลงในทั้งคุกกี้และเนื้อหาของโพสต์ ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้
csrf_token_cookie = self.request.cookies.get('g_csrf_token') if not csrf_token_cookie: webapp2.abort(400, 'No CSRF token in Cookie.') csrf_token_body = self.request.get('g_csrf_token') if not csrf_token_body: webapp2.abort(400, 'No CSRF token in post body.') if csrf_token_cookie != csrf_token_body: webapp2.abort(400, 'Failed to verify double submit cookie.')
ยืนยันโทเค็นระบุตัวตน
ในการยืนยันว่าโทเค็นถูกต้อง ให้ตรวจสอบสิ่งต่อไปนี้ เป็นไปตามเกณฑ์ต่อไปนี้
- Google ลงชื่อโทเค็นรหัสอย่างถูกต้อง ใช้คีย์สาธารณะของ Google
(มีให้บริการใน
JWK หรือ
PEM)
เพื่อยืนยันลายเซ็นของโทเค็น คีย์เหล่านี้จะมีการหมุนเวียนเป็นประจำ ตรวจสอบ
ส่วนหัว
Cache-Control
ในการตอบกลับเพื่อกำหนดเวลาที่ คุณควรดึงข้อมูลอีกครั้ง - ค่า
aud
ในโทเค็นรหัสเท่ากับหนึ่งในแอปของคุณ Client-ID การตรวจสอบนี้จำเป็นต่อการป้องกันโทเค็นรหัสที่ออกให้กับเครื่องมือที่เป็นอันตราย ที่ใช้เข้าถึงข้อมูลเกี่ยวกับผู้ใช้รายเดียวกันในเซิร์ฟเวอร์แบ็กเอนด์ของแอป - ค่าของ
iss
ในโทเค็นรหัสเท่ากับaccounts.google.com
หรือhttps://accounts.google.com
- โทเค็นรหัสยังไม่เลยเวลาหมดอายุ (
exp
) - หากต้องการตรวจสอบว่าโทเค็นรหัสแสดงถึง Google Workspace หรือ Cloud
บัญชีขององค์กร คุณสามารถตรวจสอบการอ้างสิทธิ์
hd
ซึ่งระบุการอ้างสิทธิ์ที่โฮสต์ไว้ โดเมนของผู้ใช้ ต้องใช้เมื่อจำกัดการเข้าถึงทรัพยากรไว้สำหรับสมาชิกของ บางโดเมน การที่ไม่มีการอ้างสิทธิ์นี้แสดงว่าบัญชีไม่ได้เป็นของ โดเมนที่ Google โฮสต์
เมื่อใช้ช่อง
email
,email_verified
และhd
คุณจะระบุได้ว่า Google โฮสต์และมีสิทธิ์สำหรับอีเมล ในกรณีที่ Google เชื่อถือได้ ผู้ใช้ดังกล่าวเป็นเจ้าของบัญชีที่ถูกต้อง และคุณสามารถข้ามรหัสผ่าน หรือ มากขึ้นอย่างไรกรณีที่ Google เชื่อถือได้
email
มีส่วนต่อท้าย@gmail.com
นี่คือบัญชี Gmailemail_verified
เป็นจริงและตั้งค่าhd
แล้ว นี่คือบัญชี G Suite
ผู้ใช้อาจลงทะเบียนบัญชี Google โดยไม่ใช้ Gmail หรือ G Suite ได้ วันและเวลา
email
ไม่มีคำต่อท้าย@gmail.com
และhd
ไม่มี Google ไม่มี แนะนำให้ใช้รหัสผ่านหรือวิธีการอื่นๆ ในการพิสูจน์ยืนยัน ผู้ใช้รายนั้นemail_verified
ก็อาจเป็นจริงได้ เนื่องจาก Google ได้ยืนยัน ผู้ใช้เมื่อมีการสร้างบัญชี Google แต่การเป็นเจ้าของของบุคคลที่สาม บัญชีอีเมลของคุณอาจมีการเปลี่ยนแปลงแทนที่จะเขียนโค้ดของคุณเองเพื่อดำเนินการตามขั้นตอนการยืนยันเหล่านี้ เราขอแนะนำอย่างยิ่ง ขอแนะนำให้ใช้ไลบรารีไคลเอ็นต์ Google API สำหรับแพลตฟอร์มของคุณ หรือใช้งานทั่วไป ไลบรารี JWT สำหรับการพัฒนาและการแก้ไขข้อบกพร่อง คุณสามารถโทรหา
tokeninfo
ปลายทางการตรวจสอบการใช้ไลบรารีของไคลเอ็นต์ Google API
การใช้ไลบรารีของไคลเอ็นต์ Google API รายการใดรายการหนึ่ง (เช่น Java Node.js PHP Python) เป็นวิธีที่แนะนำในการตรวจสอบโทเค็น Google ID ในสภาพแวดล้อมการใช้งานจริง
Java ในการตรวจสอบโทเค็นรหัสใน Java ให้ใช้ ออบเจ็กต์ GoogleIdTokenVerifier เช่น
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) // Specify the CLIENT_ID of the app that accesses the backend: .setAudience(Collections.singletonList(CLIENT_ID)) // Or, if multiple clients access the backend: //.setAudience(Arrays.asList(CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3)) .build(); // (Receive idTokenString by HTTPS POST) GoogleIdToken idToken = verifier.verify(idTokenString); if (idToken != null) { Payload payload = idToken.getPayload(); // Print user identifier String userId = payload.getSubject(); System.out.println("User ID: " + userId); // Get profile information from payload String 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"); // Use or store profile information // ... } else { System.out.println("Invalid ID token."); }
เมธอด
GoogleIdTokenVerifier.verify()
จะยืนยัน JWT ลายเซ็น การอ้างสิทธิ์aud
การอ้างสิทธิ์iss
และ การอ้างสิทธิ์exp
หากต้องการตรวจสอบว่าโทเค็นรหัสแสดงถึง Google Workspace หรือ Cloud บัญชีขององค์กร คุณสามารถยืนยันการอ้างสิทธิ์
hd
โดยการตรวจสอบชื่อโดเมน แสดงผลโดยเมธอดPayload.getHostedDomain()
โดเมนของ การอ้างสิทธิ์email
รายการไม่เพียงพอที่จะตรวจสอบว่าบัญชีได้รับการจัดการโดยโดเมน หรือองค์กรต่างๆNode.js ในการตรวจสอบโทเค็นรหัสใน Node.js ให้ใช้ไลบรารีการตรวจสอบสิทธิ์ของ Google สำหรับ Node.js วิธีติดตั้งไลบรารี
npm install google-auth-library --save
จากนั้นเรียกฟังก์ชันverifyIdToken()
เช่นconst {OAuth2Client} = require('google-auth-library'); const client = new OAuth2Client(); async function verify() { const ticket = await client.verifyIdToken({ idToken: token, audience: CLIENT_ID, // Specify the CLIENT_ID of the app that accesses the backend // Or, if multiple clients access the backend: //[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3] }); const payload = ticket.getPayload(); const userid = payload['sub']; // If the request specified a Google Workspace domain: // const domain = payload['hd']; } verify().catch(console.error);
ฟังก์ชัน
verifyIdToken
จะยืนยัน ลายเซ็น JWT, การอ้างสิทธิ์aud
, การอ้างสิทธิ์exp
และการอ้างสิทธิ์iss
หากต้องการตรวจสอบว่าโทเค็นรหัสแสดงถึง Google Workspace หรือ Cloud บัญชีขององค์กร คุณสามารถตรวจสอบการอ้างสิทธิ์
hd
ซึ่งระบุการอ้างสิทธิ์ที่โฮสต์ไว้ โดเมนของผู้ใช้ ต้องใช้เมื่อจำกัดการเข้าถึงทรัพยากรให้กับสมาชิกเท่านั้น ของโดเมนหนึ่งๆ การที่ไม่มีการอ้างสิทธิ์นี้แสดงว่าบัญชีนี้ไม่ได้เป็นของ โดเมนที่ Google โฮสต์PHP หากต้องการตรวจสอบโทเค็นรหัสใน PHP ให้ใช้ไลบรารีของไคลเอ็นต์ Google API สำหรับ PHP ติดตั้งไลบรารี (เช่น โดยใช้ Composer) ดังนี้
composer require google/apiclient
จากนั้นเรียกฟังก์ชันverifyIdToken()
เช่นrequire_once 'vendor/autoload.php'; // Get $id_token via HTTPS POST. $client = new Google_Client(['client_id' => $CLIENT_ID]); // Specify the CLIENT_ID of the app that accesses the backend $payload = $client->verifyIdToken($id_token); if ($payload) { $userid = $payload['sub']; // If the request specified a Google Workspace domain //$domain = $payload['hd']; } else { // Invalid ID token }
ฟังก์ชัน
verifyIdToken
จะยืนยัน ลายเซ็น JWT, การอ้างสิทธิ์aud
, การอ้างสิทธิ์exp
และการอ้างสิทธิ์iss
หากต้องการตรวจสอบว่าโทเค็นรหัสแสดงถึง Google Workspace หรือ Cloud บัญชีขององค์กร คุณสามารถตรวจสอบการอ้างสิทธิ์
hd
ซึ่งระบุการอ้างสิทธิ์ที่โฮสต์ไว้ โดเมนของผู้ใช้ ต้องใช้เมื่อจำกัดการเข้าถึงทรัพยากรให้กับสมาชิกเท่านั้น ของโดเมนหนึ่งๆ การที่ไม่มีการอ้างสิทธิ์นี้แสดงว่าบัญชีนี้ไม่ได้เป็นของ โดเมนที่ Google โฮสต์Python หากต้องการตรวจสอบโทเค็นรหัสใน Python ให้ใช้เมธอด verify_oauth2_token เช่น
from google.oauth2 import id_token from google.auth.transport import requests # (Receive token by HTTPS POST) # ... try: # Specify the CLIENT_ID of the app that accesses the backend: idinfo = id_token.verify_oauth2_token(token, requests.Request(), CLIENT_ID) # Or, if multiple clients access the backend server: # idinfo = id_token.verify_oauth2_token(token, requests.Request()) # if idinfo['aud'] not in [CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3]: # raise ValueError('Could not verify audience.') # If the request specified a Google Workspace domain # if idinfo['hd'] != DOMAIN_NAME: # raise ValueError('Wrong domain name.') # ID token is valid. Get the user's Google Account ID from the decoded token. userid = idinfo['sub'] except ValueError: # Invalid token pass
ฟังก์ชัน
verify_oauth2_token
จะยืนยัน JWT ลายเซ็น, การอ้างสิทธิ์aud
และการอ้างสิทธิ์exp
คุณต้องยืนยันhd
ด้วย การอ้างสิทธิ์ (หากมี) โดยการตรวจสอบออบเจ็กต์ที่verify_oauth2_token
กลับมา หากมีลูกค้าหลายรายเข้าถึง เซิร์ฟเวอร์ส่วนหลัง ให้ยืนยันการอ้างสิทธิ์aud
ด้วยตนเองด้วย- Google ลงชื่อโทเค็นรหัสอย่างถูกต้อง ใช้คีย์สาธารณะของ Google
(มีให้บริการใน
JWK หรือ
PEM)
เพื่อยืนยันลายเซ็นของโทเค็น คีย์เหล่านี้จะมีการหมุนเวียนเป็นประจำ ตรวจสอบ
ส่วนหัว
เมื่อยืนยันความถูกต้องของโทเค็นแล้ว คุณจะใช้ข้อมูลในโทเค็นระบุตัวตนของ Google เพื่อเชื่อมโยงสถานะบัญชีของเว็บไซต์ได้ ดังนี้
ผู้ใช้ที่ไม่ได้ลงทะเบียน: คุณสามารถแสดงอินเทอร์เฟซผู้ใช้ (UI) การลงชื่อสมัครใช้ที่อนุญาตให้ผู้ใช้ระบุข้อมูลเพิ่มเติมในโปรไฟล์ได้ หากจำเป็น และยังอนุญาตให้ผู้ใช้สร้างบัญชีใหม่และเซสชันผู้ใช้ที่เข้าสู่ระบบโดยอัตโนมัติ
บัญชีที่มีอยู่ซึ่งอยู่ในเว็บไซต์ของคุณอยู่แล้ว: คุณสามารถแสดงหน้าเว็บที่อนุญาตให้ผู้ใช้ปลายทางป้อนรหัสผ่านและลิงก์บัญชีเดิมกับข้อมูลเข้าสู่ระบบ Google ได้ ซึ่งจะยืนยันว่าผู้ใช้มีสิทธิ์เข้าถึงบัญชีที่มีอยู่
ผู้ใช้ที่กลับมาซึ่งใช้การรวมข้อมูล: คุณสามารถลงชื่อเข้าใช้ผู้ใช้โดยอัตโนมัติได้