پس از اینکه Google یک رمز شناسه را برگرداند، با درخواست روش HTTP POST ، با credential نام پارامتر، به نقطه پایانی ورود به سیستم شما ارسال میشود.
مثال زیر در زبان پایتون است که مراحل معمول اعتبارسنجی و مصرف نشانه ID را نشان می دهد:
توکن جعل درخواست متقابل (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 (در قالب JWK یا PEM موجود است) برای تأیید امضای توکن استفاده کنید. این کلیدها به طور منظم چرخانده می شوند. هدر
Cache-Controlرا در پاسخ بررسی کنید تا مشخص کنید چه زمانی باید دوباره آنها را بازیابی کنید. - مقدار
audدر کد ID برابر با یکی از شناسه های مشتری برنامه شما است. این بررسی برای جلوگیری از استفاده از کدهای شناسه صادر شده برای یک برنامه مخرب برای دسترسی به دادههای مربوط به همان کاربر در سرور پشتیبان برنامه شما ضروری است. - مقدار
issدر کد شناسه برابر باaccounts.google.comیاhttps://accounts.google.comاست. - زمان انقضا (
exp) شناسه توکن سپری نشده است. - اگر باید تأیید کنید که رمز شناسه یک حساب سازمانی Google Workspace یا Cloud را نشان میدهد، میتوانید ادعای
hdرا بررسی کنید، که دامنه میزبانی کاربر را نشان میدهد. این باید زمانی استفاده شود که دسترسی به یک منبع را فقط به اعضای دامنه های خاص محدود می کند. عدم وجود این ادعا نشان می دهد که این حساب متعلق به دامنه میزبان گوگل نیست.
با استفاده از فیلدهای
email،email_verifiedوhd، میتوانید تعیین کنید که آیا Google میزبان آدرس ایمیل است یا خیر. در مواردی که Google معتبر است، کاربر به عنوان مالک قانونی حساب شناخته میشود و ممکن است از رمز عبور یا سایر روشهای چالش صرفنظر کنید.مواردی که گوگل معتبر است:
-
emailدارای پسوند@gmail.comاست، این یک حساب کاربری جیمیل است. -
email_verifiedدرست است وhdتنظیم شده است، این یک حساب Google Workspace است.
کاربران می توانند بدون استفاده از Gmail یا Google Workspace برای حساب های Google ثبت نام کنند. وقتی
emailحاوی پسوند@gmail.comنیست وhdوجود ندارد، گوگل معتبر نیست و رمز عبور یا روشهای چالش دیگری برای تأیید کاربر توصیه میشود.email_verifiedهمچنین می تواند درست باشد زیرا Google در ابتدا کاربر را هنگام ایجاد حساب Google تأیید کرد، اما مالکیت حساب ایمیل شخص ثالث ممکن است از آن زمان تغییر کرده باشد.به جای نوشتن کد خود برای انجام این مراحل تأیید، ما قویاً توصیه میکنیم از کتابخانه سرویس گیرنده Google API برای پلتفرم خود یا یک کتابخانه JWT همه منظوره استفاده کنید. برای توسعه و اشکالزدایی، میتوانید با نقطه پایانی اعتبارسنجی
tokeninfoما تماس بگیرید.使用 Google API 客户端库
使用某个 Google API 客户端库(例如 Java、 Node.js、 PHP、 Python) 是在生产环境中验证 Google ID 令牌的推荐方法。
<ph type="x-smartling-placeholder"></ph> <ph type="x-smartling-placeholder"> </ph> 。 <ph type="x-smartling-placeholder">Java 要在 Java 中验证 ID 令牌,请使用 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 WEB_CLIENT_ID of the app that accesses the backend: .setAudience(Collections.singletonList(WEB_CLIENT_ID)) // Or, if multiple clients access the backend: //.setAudience(Arrays.asList(WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3)) .build(); // (Receive idTokenString by HTTPS POST) GoogleIdToken idToken = verifier.verify(idTokenString); if (idToken != null) { Payload payload = idToken.getPayload(); // Print user identifier. This ID is unique to each Google Account, making it suitable for // use as a primary key during account lookup. Email is not a good choice because it can be // changed by the user. 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项版权主张。如果您需要验证 ID 令牌是否代表 Google Workspace 或 Cloud 组织账号,您可以通过检查域名来验证
hd所有权声明 由Payload.getHostedDomain()方法返回。该email声明不足以保证账号是由网域管理 或组织。</ph> 。 <ph type="x-smartling-placeholder">Node.js 要在 Node.js 中验证 ID 令牌,请使用适用于 Node.js 的 Google Auth 库。 安装该库:
然后,调用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: WEB_CLIENT_ID, // Specify the WEB_CLIENT_ID of the app that accesses the backend // Or, if multiple clients access the backend: //[WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_CLIENT_ID_3] }); const payload = ticket.getPayload(); // This ID is unique to each Google Account, making it suitable for use as a primary key // during account lookup. Email is not a good choice because it can be changed by the user. 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声明。如果您需要验证 ID 令牌是否代表 Google Workspace 或 Cloud 组织账号时,您可以查看
hd声明,该声明表示托管的 用户的网域。将资源访问权限限制为仅允许成员访问时,必须使用此设置 特定网域的用户缺少此声明即表示该账号不属于 Google 托管的域。</ph> 。 <ph type="x-smartling-placeholder">PHP 要在 PHP 中验证 ID 令牌,请使用适用于 PHP 的 Google API 客户端库。 安装该库(例如,使用 Composer):
然后,调用composer require google/apiclient
verifyIdToken()函数。例如:require_once 'vendor/autoload.php'; // Get $id_token via HTTPS POST. $client = new Google_Client(['client_id' => $WEB_CLIENT_ID]); // Specify the WEB_CLIENT_ID of the app that accesses the backend $payload = $client->verifyIdToken($id_token); if ($payload) { // This ID is unique to each Google Account, making it suitable for use as a primary key // during account lookup. Email is not a good choice because it can be changed by the user. $userid = $payload['sub']; // If the request specified a Google Workspace domain //$domain = $payload['hd']; } else { // Invalid ID token }
verifyIdToken函数用于验证 JWT 签名、aud声明、exp声明 以及iss声明。如果您需要验证 ID 令牌是否代表 Google Workspace 或 Cloud 组织账号时,您可以查看
hd声明,该声明表示托管的 用户的网域。将资源访问权限限制为仅允许成员访问时,必须使用此设置 特定网域的用户缺少此声明即表示该账号不属于 Google 托管的域。</ph> Python 要在 Python 中验证 ID 令牌,请使用 verify_oauth2_token 函数。例如:
from google.oauth2 import id_token from google.auth.transport import requests # (Receive token by HTTPS POST) # ... try: # Specify the WEB_CLIENT_ID of the app that accesses the backend: idinfo = id_token.verify_oauth2_token(token, requests.Request(), WEB_CLIENT_ID) # Or, if multiple clients access the backend server: # idinfo = id_token.verify_oauth2_token(token, requests.Request()) # if idinfo['aud'] not in [WEB_CLIENT_ID_1, WEB_CLIENT_ID_2, WEB_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. # This ID is unique to each Google Account, making it suitable for use as a primary key # during account lookup. Email is not a good choice because it can be changed by the user. userid = idinfo['sub'] except ValueError: # Invalid token pass
verify_oauth2_token函数验证 JWT 签名、aud声明和exp声明。 您还必须验证hd检查verify_oauth2_token返回。如果多个客户端访问 后端服务器,另请手动验证aud声明。- رمز شناسه به درستی توسط گوگل امضا شده است. از کلیدهای عمومی Google (در قالب JWK یا PEM موجود است) برای تأیید امضای توکن استفاده کنید. این کلیدها به طور منظم چرخانده می شوند. هدر
پس از تأیید اعتبار نشانه، میتوانید از اطلاعات موجود در شناسه Google برای مرتبط کردن وضعیت حساب سایت خود استفاده کنید:
کاربر ثبتنشده: میتوانید یک رابط کاربری ثبتنام (UI) نشان دهید که به کاربر اجازه میدهد در صورت نیاز اطلاعات نمایه اضافی را ارائه دهد. همچنین به کاربر این امکان را میدهد که در سکوت یک حساب کاربری جدید و یک جلسه کاربر وارد شده ایجاد کند.
یک حساب موجود که از قبل در سایت شما وجود دارد: می توانید صفحه وب را نشان دهید که به کاربر نهایی امکان می دهد رمز عبور خود را وارد کرده و حساب قدیمی را با اعتبار Google خود پیوند دهد. این تأیید می کند که کاربر به حساب موجود دسترسی دارد.
کاربر فدرال بازگشتی: میتوانید در سکوت کاربر را وارد کنید.