หลังจากที่ Google ส่งคืนโทเค็นรหัสแล้ว โทเค็นนี้จะส่งโดยคำขอเมธอด HTTP POST
ที่มีชื่อพารามิเตอร์ credential
ไปยังปลายทางการเข้าสู่ระบบ
ตัวอย่างในภาษา Python ที่แสดงขั้นตอนทั่วไปในการตรวจสอบและใช้โทเค็นรหัส มีดังนี้
ยืนยันโทเค็น Cross-Site Request Forgery (CSRF) เมื่อคุณส่งข้อมูลเข้าสู่ระบบไปยังปลายทางการเข้าสู่ระบบ เราจะใช้รูปแบบการส่งคุกกี้ซ้ำเพื่อป้องกันการโจมตี 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 ในสภาพแวดล้อมการใช้งานจริง
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 Auth สำหรับ 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 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 ได้ เพื่อเป็นการยืนยันว่า ผู้ใช้มีสิทธิ์เข้าถึงบัญชีที่มีอยู่
ผู้ใช้ที่กลับมาแบบรวมศูนย์ที่กลับมา: คุณสามารถให้ผู้ใช้ลงชื่อเข้าใช้แบบเงียบ