ภาพรวม
เมื่อวันที่ 16 กุมภาพันธ์ 2022 เรา ได้ประกาศ แผนการทำให้การโต้ตอบ OAuth ของ Google ปลอดภัยยิ่งขึ้นโดยใช้ขั้นตอน OAuth ที่ปลอดภัยกว่า คู่มือนี้จะช่วยให้คุณเข้าใจการเปลี่ยนแปลงและขั้นตอนที่จำเป็นในการ ย้ายข้อมูลจากขั้นตอนที่อยู่ IP ของ Loopback ไปยังทางเลือกอื่นที่รองรับได้สำเร็จ
ความพยายามนี้เป็นมาตรการป้องกันการโจมตีแบบฟิชชิงและการแอบอ้างเป็นแอป ในระหว่างการโต้ตอบกับปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google
ขั้นตอนที่อยู่ IP ของ Loopback คืออะไร
ขั้นตอนที่อยู่ IP ของ Loopback รองรับการใช้ที่อยู่ IP ของ Loopback หรือlocalhost เป็นคอมโพเนนต์โฮสต์ของ URI การเปลี่ยนเส้นทางที่จะส่งข้อมูลเข้าสู่ระบบไปให้หลังจากที่ผู้ใช้ให้ความยินยอมตามคำขอ OAuth ขั้นตอนนี้มีความเสี่ยงต่อการโจมตีแบบ
Man-in-the-Middle
ซึ่งแอปที่ประสงค์ร้ายซึ่งเข้าถึงอินเทอร์เฟซ Loopback เดียวกันในระบบปฏิบัติการบางระบบอาจสกัดกั้นการตอบกลับจากเซิร์ฟเวอร์การให้สิทธิ์ไปยัง URI การเปลี่ยนเส้นทางที่ระบุและเข้าถึงรหัสการให้สิทธิ์ได้
เราจะเลิกใช้งานขั้นตอนที่อยู่ IP ของ Loopback สำหรับประเภทไคลเอ็นต์ OAuth ของ iOS, Android, และ Chrome แต่จะยังคงรองรับในแอปบนเดสก์ท็อป ต่อไป
วันที่สำคัญที่ต้องปฏิบัติตาม
- 14 มีนาคม 2022 - บล็อกไม่ให้ไคลเอ็นต์ OAuth ใหม่ใช้ขั้นตอนที่อยู่ IP ของ Loopback
- 1 สิงหาคม 2022 - อาจแสดงข้อความเตือนที่ผู้ใช้เห็นสำหรับคำขอ OAuth ที่ไม่เป็นไปตามข้อกำหนด
- 31 สิงหาคม 2022 - บล็อกไม่ให้ไคลเอ็นต์ OAuth ของ Android, แอป Chrome และ iOS ที่สร้างขึ้นก่อนวันที่ 14 มีนาคม 2022 ใช้ขั้นตอนที่อยู่ IP ของ Loopback
- 21 ตุลาคม 2022 - บล็อกไคลเอ็นต์ที่มีอยู่ทั้งหมด (รวมถึงไคลเอ็นต์ที่ได้รับการยกเว้น)
ระบบจะแสดงข้อความแสดงข้อผิดพลาดที่ผู้ใช้เห็นสำหรับคำขอที่ไม่เป็นไปตามข้อกำหนด ข้อความจะแจ้งให้ผู้ใช้ทราบว่าระบบบล็อกแอปในขณะที่ แสดงอีเมลติดต่อที่ลงทะเบียนไว้ใน หน้าจอขอความยินยอม OAuth ในคอนโซล Google Cloud
- ตรวจสอบว่าคุณได้รับผลกระทบหรือไม่
- หากได้รับผลกระทบ ให้ย้ายข้อมูลไปใช้ทางเลือกอื่นที่รองรับ
ตรวจสอบว่าคุณได้รับผลกระทบหรือไม่
ตรวจสอบประเภทรหัสไคลเอ็นต์ OAuth
ไปที่ หน้าไคลเอ็นต์ของ คอนโซล Google Cloud แล้วดูประเภทรหัสไคลเอ็นต์ OAuth ในส่วน รหัสไคลเอ็นต์ OAuth 2.0 ซึ่งจะเป็นประเภทใดประเภทหนึ่งต่อไปนี้ เว็บแอปพลิเคชัน Android iOS Universal Windows Platform (UWP) แอป Chrome ทีวีและอุปกรณ์ที่มีอินพุตจำกัด แอปบนเดสก์ท็อป
ทำตามขั้นตอนถัดไปหากประเภทไคลเอ็นต์ของคุณคือ Android, แอป Chrome หรือ iOS และคุณใช้ ขั้นตอนที่อยู่ IP ของ Loopback
คุณไม่จำเป็นต้องดำเนินการใดๆ ที่เกี่ยวข้องกับการเลิกใช้งานนี้หากใช้ ขั้นตอนที่อยู่ IP ของ Loopback ในไคลเอ็นต์ OAuth ของแอปบนเดสก์ท็อป เนื่องจากระบบจะยังคงรองรับการใช้งานกับไคลเอ็นต์ OAuth ประเภทดังกล่าวต่อไป
วิธีตรวจสอบว่าแอปของคุณใช้ขั้นตอนที่อยู่ IP ของ Loopback หรือไม่
ตรวจสอบโค้ดของแอป หรือ การเรียกเครือข่ายขาออก (ในกรณีที่ แอปใช้ไลบรารี OAuth) เพื่อดูว่าคำขอการให้สิทธิ์ OAuth ของ Google ที่แอปส่ง นั้นใช้ค่า URI การเปลี่ยนเส้นทางของ Loopback หรือไม่
ตรวจสอบโค้ดของแอปพลิเคชัน
redirect_uri มีค่าใดค่าหนึ่งต่อไปนี้หรือไม่ redirect_uri=http://127.0.0.1:<port> เช่น
redirect_uri=http://127.0.0.1:3000
redirect_uri=http://[::1]:<port> เช่น
redirect_uri=http://[::1]:3000
redirect_uri=http://localhost:<port> เช่น
redirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
ตรวจสอบการเรียกเครือข่ายขาออก
- เว็บแอปพลิเคชัน - ตรวจสอบกิจกรรมเครือข่ายใน Chrome
- Android - ตรวจสอบการจราจรของข้อมูลในเครือข่ายด้วยเครื่องมือตรวจสอบเครือข่าย
-
แอป Chrome
- ไปที่หน้าส่วนขยาย Chrome
- เลือกช่องทำเครื่องหมายโหมดนักพัฒนาซอฟต์แวร์ ที่มุมขวาบน ของหน้าส่วนขยาย
- เลือกส่วนขยายที่ต้องการตรวจสอบ
- คลิกลิงก์หน้าพื้นหลัง ในส่วน ตรวจสอบมุมมอง ของหน้าส่วนขยาย
- ป๊อปอัปเครื่องมือสำหรับนักพัฒนาซอฟต์แวร์ จะเปิดขึ้น ซึ่งคุณสามารถ ตรวจสอบการจราจรของข้อมูลในเครือข่ายใน แท็บเครือข่ายได้
- iOS - การวิเคราะห์การรับส่งข้อมูล HTTP ด้วย Instruments
- แอปบนเดสก์ท็อป - ใช้เครื่องมือดักจับเครือข่าย ที่พร้อมใช้งานสำหรับระบบปฏิบัติการที่ใช้พัฒนาแอป
redirect_uri มีค่าใดค่าหนึ่งต่อไปนี้หรือไม่
-
redirect_uri=http://127.0.0.1:<port>เช่นredirect_uri=http://127.0.0.1:3000 -
redirect_uri=http://[::1]:<port>เช่นredirect_uri=http://[::1]:3000 -
redirect_uri=http://localhost:<port>เช่นredirect_uri=http://localhost:3000
https://accounts.google.com/o/oauth2/v2/auth? redirect_uri=http://localhost:3000& response_type=code& scope=<SCOPES>& state=<STATE>& client_id=<CLIENT_ID>
ย้ายข้อมูลไปใช้ทางเลือกอื่นที่รองรับ
ไคลเอ็นต์บนอุปกรณ์เคลื่อนที่ (Android / iOS)
หากตรวจสอบแล้วว่าแอปของคุณใช้ขั้นตอนที่อยู่ IP ของ Loopback กับไคลเอ็นต์ OAuth ประเภท Android หรือ iOS คุณควรย้ายข้อมูลไปใช้ SDK ที่แนะนำ (Android, iOS)
SDK ช่วยให้เข้าถึง Google APIs ได้ง่ายและจัดการการเรียกทั้งหมดไปยัง ปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google
ลิงก์เอกสารด้านล่างมีข้อมูลเกี่ยวกับวิธีใช้ SDK ที่แนะนำเพื่อเข้าถึง Google APIs โดยไม่ใช้ URI การเปลี่ยนเส้นทางที่อยู่ IP ของ Loopback
เข้าถึง Google APIs ใน Android
การเข้าถึงฝั่งไคลเอ็นต์
ListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder().setRequestedScopes(requestedScopes).build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { // Access already granted, continue with user action saveToDriveAppFolder(authorizationResult); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
ส่ง authorizationResult ไปยังเมธอดที่กำหนดเพื่อบันทึกเนื้อหาลงใน
โฟลเดอร์ไดรฟ์ของผู้ใช้ authorizationResult มีเมธอด
getAccessToken() ที่แสดงผลโทเค็นเพื่อการเข้าถึง
การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
ตัวอย่างต่อไปนี้แสดงวิธีเข้าถึง Google APIs ในฝั่งเซิร์ฟเวอร์บน AndroidListrequestedScopes = Arrays.asList(DriveScopes.DRIVE_APPDATA); AuthorizationRequest authorizationRequest = AuthorizationRequest.builder() .requestOfflineAccess(webClientId) .setRequestedScopes(requestedScopes) .build(); Identity.getAuthorizationClient(activity) .authorize(authorizationRequest) .addOnSuccessListener( authorizationResult -> { if (authorizationResult.hasResolution()) { // Access needs to be granted by the user PendingIntent pendingIntent = authorizationResult.getPendingIntent(); try { startIntentSenderForResult(pendingIntent.getIntentSender(), REQUEST_AUTHORIZE, null, 0, 0, 0, null); } catch (IntentSender.SendIntentException e) { Log.e(TAG, "Couldn't start Authorization UI: " + e.getLocalizedMessage()); } } else { String authCode = authorizationResult.getServerAuthCode(); } }) .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));
authorizationResult มีเมธอด
getServerAuthCode() ที่แสดงผลรหัสการให้สิทธิ์ ซึ่งคุณสามารถส่งไปยัง
แบ็กเอนด์เพื่อรับโทเค็นเพื่อการเข้าถึงและโทเค็นการรีเฟรช
เข้าถึง Google APIs ในแอป iOS
การเข้าถึงฝั่งไคลเอ็นต์
ตัวอย่างด้านล่างแสดงวิธีเข้าถึง Google APIs ในฝั่งไคลเอ็นต์บน iOS
user.authentication.do { authentication, error in guard error == nil else { return } guard let authentication = authentication else { return } // Get the access token to attach it to a REST or gRPC request. let accessToken = authentication.accessToken // Or, get an object that conforms to GTMFetcherAuthorizationProtocol for // use with GTMAppAuth and the Google APIs client library. let authorizer = authentication.fetcherAuthorizer() }
ใช้โทเค็นเพื่อการเข้าถึงในการเรียก API โดยใส่โทเค็นเพื่อการเข้าถึงใน
ส่วนหัวของคำขอ REST หรือ gRPC (Authorization: Bearer ACCESS_TOKEN)
หรือใช้ตัวให้สิทธิ์ Fetcher (GTMFetcherAuthorizationProtocol) กับ
ไลบรารีของไคลเอ็นต์ Google APIs สำหรับ Objective-C สำหรับ REST
อ่านคู่มือการเข้าถึงฝั่งไคลเอ็นต์เกี่ยวกับวิธีเข้าถึง Google APIs ในฝั่งไคลเอ็นต์ เกี่ยวกับวิธีเข้าถึง Google APIs ในฝั่งไคลเอ็นต์
การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
ตัวอย่างด้านล่างแสดงวิธีเข้าถึง Google APIs ในฝั่งเซิร์ฟเวอร์เพื่อรองรับไคลเอ็นต์ iOSGIDSignIn.sharedInstance.signIn(with: signInConfig, presenting: self) { user, error in
guard error == nil else { return }
guard let user = user else { return }
// request a one-time authorization code that your server exchanges for
// an access token and refresh token
let authCode = user.serverAuthCode
}อ่านคู่มือการเข้าถึงฝั่งเซิร์ฟเวอร์เกี่ยวกับวิธีเข้าถึง Google APIs จากฝั่งเซิร์ฟเวอร์
ไคลเอ็นต์แอป Chrome
หากตรวจสอบแล้วว่าแอปของคุณใช้ขั้นตอนที่อยู่ IP ของ Loopback ในไคลเอ็นต์แอป Chrome คุณควรย้ายข้อมูลไปใช้ Chrome Identity API
ตัวอย่างด้านล่างแสดงวิธีรับรายชื่อติดต่อทั้งหมดของผู้ใช้โดยไม่ใช้ URI การเปลี่ยนเส้นทางที่อยู่ IP ของ Loopback
window.onload = function() { document.querySelector('button').addEventListener('click', function() { // retrieve access token chrome.identity.getAuthToken({interactive: true}, function(token) { // .......... // the example below shows how to use a retrieved access token with an appropriate scope // to call the Google People API contactGroups.get endpoint fetch( 'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY', init) .then((response) => response.json()) .then(function(data) { console.log(data) }); }); }); };
อ่านคู่มือ Chrome Identity API เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับวิธีตรวจสอบสิทธิ์ผู้ใช้และเรียกปลายทางของ Google ด้วย Chrome Identity API