ภาพรวม
ในวันที่ 16 กุมภาพันธ์ 2022 เราได้ ประกาศแผนที่จะทำให้การโต้ตอบ OAuth ของ Google ปลอดภัยยิ่งขึ้นด้วยการใช้ขั้นตอน OAuth ที่ปลอดภัยมากขึ้น คำแนะนำนี้ช่วยให้คุณเข้าใจการเปลี่ยนแปลงและขั้นตอนที่จำเป็นในการย้ายข้อมูลจากขั้นตอนที่อยู่ IP แบบวนกลับไปยังทางเลือกที่รองรับให้สำเร็จ
ซึ่งใช้เป็นมาตรการป้องกันฟิชชิงและการโจมตีแบบแอบอ้างเป็นแอป ในระหว่างการโต้ตอบกับปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google
โฟลว์ที่อยู่ IP ของ Loopback คืออะไร
โฟลว์ที่อยู่ IP แบบ Loopback รองรับการใช้ที่อยู่ IP แบบ Loopback หรือlocalhost
เป็นคอมโพเนนต์โฮสต์ของ URI การเปลี่ยนเส้นทางที่มีการส่งข้อมูลเข้าสู่ระบบไปหลังจากที่ผู้ใช้อนุมัติคำขอความยินยอม OAuth ขั้นตอนนี้มีช่องโหว่ที่จะถูกโจมตีแบบแทรกกลางการสื่อสารซึ่งแอปที่เป็นอันตรายซึ่งเข้าถึงอินเทอร์เฟซ Loopback เดียวกันในระบบปฏิบัติการบางระบบ อาจสกัดกั้นการตอบสนองจากเซิร์ฟเวอร์การให้สิทธิ์ไปยัง URI การเปลี่ยนเส้นทางที่ระบุและรับสิทธิ์เข้าถึงรหัสการให้สิทธิ์
เราจะเลิกใช้งานโฟลว์ที่อยู่ IP แบบ Loopback สำหรับประเภทไคลเอ็นต์ OAuth แบบ iOS, Android และ Chrome แบบเนทีฟ แต่แอปบนเดสก์ท็อปจะยังคงรองรับต่อไป
วันที่ที่สำคัญในการปฏิบัติตามข้อกำหนด
- 14 มีนาคม 2022 - ไคลเอ็นต์ OAuth ใหม่ถูกบล็อกไม่ให้ใช้โฟลว์ที่อยู่ IP ของ Loopback
- 1 สิงหาคม 2022 - ข้อความเตือนที่แสดงต่อผู้ใช้อาจแสดงสำหรับคำขอ OAuth ที่ไม่เป็นไปตามนโยบาย
- 31 สิงหาคม 2022 - โฟลว์ที่อยู่ IP ของ Loopback ถูกบล็อกสำหรับ Android, แอป Chrome และไคลเอ็นต์ OAuth ของ iOS ที่สร้างขึ้นก่อนวันที่ 14 มีนาคม 2022
- 21 ตุลาคม 2022 - ลูกค้าที่มีอยู่ทั้งหมดจะถูกบล็อก (รวมถึงลูกค้าที่ได้รับการยกเว้น)
ข้อความแสดงข้อผิดพลาดที่แสดงต่อผู้ใช้จะแสดงสำหรับคำขอที่ไม่เป็นไปตามข้อกำหนด ข้อความจะแจ้งให้ผู้ใช้ทราบว่าแอปถูกบล็อกขณะแสดงอีเมลสนับสนุนที่คุณได้ลงทะเบียนไว้ในหน้าจอขอความยินยอม OAuth ในคอนโซล Google API
- ตรวจสอบว่าคุณได้รับผลกระทบหรือไม่
- ย้ายข้อมูลไปยังทางเลือกที่รองรับหากคุณได้รับผลกระทบ
ตรวจสอบว่าคุณได้รับผลกระทบหรือไม่
ตรวจสอบประเภทรหัสไคลเอ็นต์ OAuth
ไปที่ Credentials page ของ Google API Console และดูประเภทรหัสไคลเอ็นต์ OAuth ในส่วนรหัสไคลเอ็นต์ OAuth 2.0 โดยจะเป็นอย่างใดอย่างหนึ่งต่อไปนี้ เว็บแอปพลิเคชัน, Android, iOS, Universal Windows Platform (UWP), แอป Chrome, TV และอุปกรณ์อินพุตแบบจำกัด และ แอปเดสก์ท็อป
ทำขั้นตอนถัดไปหากประเภทไคลเอ็นต์ของคุณคือ Android, แอป Chrome หรือ iOS และคุณกำลังใช้โฟลว์ที่อยู่ IP แบบ Loopback
คุณไม่จำเป็นต้องดำเนินการใดๆ เกี่ยวกับการเลิกใช้งานนี้ หากคุณใช้โฟลว์ที่อยู่ IP แบบ Loopback ในไคลเอ็นต์ OAuth ของแอปเดสก์ท็อป เนื่องจากระบบจะยังคงรองรับการใช้งานกับไคลเอ็นต์ OAuth ประเภทดังกล่าวต่อไป
วิธีตรวจสอบว่าแอปของคุณใช้โฟลว์ที่อยู่ IP แบบ Loopback หรือไม่
ตรวจสอบโค้ดของแอปหรือการโทรออกจากเครือข่าย (ในกรณีที่แอปใช้ไลบรารี OAuth) เพื่อดูว่า คำขอการให้สิทธิ์ Google OAuth ที่แอปของคุณดำเนินการอยู่ใช้ค่า 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 ด้วยเครื่องมือ
- Universal Windows Platform (UWP) - ตรวจสอบการจราจรของข้อมูลในเครือข่ายใน Visual Studio
- แอปบนเดสก์ท็อป - ใช้เครื่องมือบันทึกเครือข่าย ที่พร้อมใช้งานสำหรับระบบปฏิบัติการที่แอปพัฒนาขึ้น
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 อุปกรณ์เคลื่อนที่ของ Google Sign-In (Android, iOS)
SDK ช่วยให้เข้าถึง Google API และจัดการการเรียกใช้ทั้งหมดไปยังปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google ได้อย่างง่ายดาย
ลิงก์เอกสารประกอบด้านล่างให้ข้อมูลเกี่ยวกับวิธีใช้ SDK การลงชื่อเข้าใช้ของ Google เพื่อเข้าถึง Google APIs โดยไม่ต้องใช้ URI การเปลี่ยนเส้นทางที่อยู่ IP แบบ Loopback
เข้าถึง Google APIs บน Android
การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
ตัวอย่างด้านล่างแสดงวิธี เข้าถึง Google APIs จากฝั่งเซิร์ฟเวอร์บน AndroidTask<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); try { GoogleSignInAccount account = task.getResult(ApiException.class); // request a one-time authorization code that your server exchanges for an // access token and sometimes refresh token String authCode = account.getServerAuthCode(); // Show signed-in UI updateUI(account); // TODO(developer): send code to server and exchange for access/refresh/ID tokens } catch (ApiException e) { Log.w(TAG, "Sign-in failed", e); updateUI(null); }
อ่านคู่มือการเข้าถึงฝั่งเซิร์ฟเวอร์เพื่อดูวิธีเข้าถึง Google APIs จากฝั่งเซิร์ฟเวอร์
เข้าถึง 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
) หรือใช้ผู้ให้สิทธิ์การดึงข้อมูล (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