ภาพรวม
เมื่อวันที่ 16 กุมภาพันธ์ 2022 เราได้ประกาศแผนทําให้การโต้ตอบของ Google OAuth ปลอดภัยยิ่งขึ้นโดยใช้ขั้นตอน OAuth ที่มีความปลอดภัยมากขึ้น คู่มือนี้ช่วยให้คุณเข้าใจการเปลี่ยนแปลงและขั้นตอนที่จําเป็นในการย้ายข้อมูลจากที่อยู่ IP แบบวนซ้ําไปยังตัวเลือกอื่นที่รองรับได้สําเร็จ
การดําเนินการนี้เป็นมาตรการป้องกันการโจมตีแบบฟิชชิงและการปลอมแปลงแอประหว่างการโต้ตอบกับปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google
ขั้นตอนของที่อยู่ IP ของ Loopback คืออะไร
ขั้นตอนการใช้ที่อยู่ IP แบบวนซ้ํารองรับการใช้ที่อยู่ IP แบบ Loopback หรือlocalhost
เป็นคอมโพเนนต์โฮสต์ของ URI การเปลี่ยนเส้นทางที่มีการส่งข้อมูลรับรองหลังจากที่ผู้ใช้อนุมัติคําขอคํายินยอม OAuth โฟลว์นี้เสี่ยงต่อการถูกโจมตีตรงกลางซึ่งแอปที่มีความสําคัญ การเข้าถึงอินเทอร์เฟซการวนกลับเดียวกันในระบบปฏิบัติการบางระบบ อาจสกัดกั้นจากเซิร์ฟเวอร์การให้สิทธิ์ไปยัง URI การเปลี่ยนเส้นทางหนึ่งๆ และได้รับสิทธิ์เข้าถึงรหัสการให้สิทธิ์
เรากําลังเลิกใช้งานขั้นตอนการใช้ที่อยู่ IP แบบวนซ้ําสําหรับไคลเอ็นต์ OAuth ประเภท iOS, Android และ Chrome แต่ยังคงใช้งานได้ในแอปในเดสก์ท็อป
วันที่การปฏิบัติตามข้อกําหนดที่สําคัญ
- 14 มีนาคม 2022 - ไคลเอ็นต์ OAuth ใหม่ที่ถูกบล็อกไม่ให้ใช้ขั้นตอนที่อยู่ IP แบบ Loopback
- 1 สิงหาคม 2022 - อาจมีการแสดงข้อความเตือนแก่ผู้ใช้ต่อคําขอ OAuth ที่ไม่เป็นไปตามนโยบาย
- 31 สิงหาคม 2022 - บล็อกขั้นตอนที่อยู่ IP แบบ Loopback สําหรับไคลเอ็นต์เดิมของแอป Android, Chrome และ iOS OAuth ที่สร้างขึ้นก่อนวันที่ 14 มีนาคม 2022
- 21 ตุลาคม 2022 - ไคลเอ็นต์ที่มีอยู่ทั้งหมดจะถูกบล็อก (รวมถึงไคลเอ็นต์ที่ได้รับการยกเว้น) ไคลเอ็นต์สามารถขอขยายเวลาเพียงครั้งเดียวเพื่อใช้ขั้นตอนที่อยู่ IP แบบ Loopback ต่อไปได้จนถึงวันที่ 21 ตุลาคม 2022 ตามที่เคยระบุไว้ในข้อความอีเมลซึ่งส่งถึงไคลเอ็นต์ที่ได้รับผลกระทบ
ข้อความเตือนที่แสดงต่อผู้ใช้อาจปรากฏสําหรับคําขอที่ไม่เป็นไปตามข้อกําหนด 1 เดือนก่อน เช่น วันที่ 1 สิงหาคม 2022 เราจะเลิกใช้งานขั้นตอนที่อยู่ IP ของ Loopback โดยสมบูรณ์ ข้อความนี้จะแจ้งให้ผู้ใช้ทราบว่าแอปนั้นอาจถูกบล็อกในไม่ช้า ขณะที่แสดงอีเมลสนับสนุนที่คุณลงทะเบียนไว้ในหน้าจอคํายินยอม OAuth ในคอนโซล Google API
คุณรับทราบข้อความเตือนที่แสดงแก่ผู้ใช้และระงับโดยการส่งพารามิเตอร์การค้นหาในการเรียกใช้การให้สิทธิ์ดังที่แสดงด้านล่าง- ไปที่โค้ดในแอปที่คุณส่งคําขอไปยังปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google
-
เพิ่มพารามิเตอร์
ack_loopback_shutdown
ที่มีค่าของวันที่บังคับใช้: 2022-08-31 ในคําขอโฟลว์เปลี่ยนเส้นทาง ตัวอย่าง:ack_loopback_shutdown=2022-08-31
- ตรวจสอบว่าได้รับผลกระทบหรือไม่
- ย้ายข้อมูลไปยังทางเลือกที่รองรับหากได้รับผลกระทบ
ตรวจสอบว่าได้รับผลกระทบหรือไม่
ตรวจสอบประเภทรหัสไคลเอ็นต์ OAuth
ไปที่ Credentials page ของ Google API Console และดูประเภทรหัสไคลเอ็นต์ OAuth ในส่วนรหัสไคลเอ็นต์ OAuth 2.0 โดยจะเป็นอย่างใดอย่างหนึ่งต่อไปนี้: เว็บแอปพลิเคชัน, Android, iOS, Universal Windows Platform (UWP), แอป Chrome, ทีวีและอุปกรณ์อินพุตที่จํากัด, แอปเดสก์ท็อป
ดําเนินการขั้นตอนถัดไปหากประเภทไคลเอ็นต์ของคุณคือ Android, แอป Chrome หรือ iOS และคุณกําลังใช้ขั้นตอนที่อยู่ IP แบบวนกลับ
คุณไม่จําเป็นต้องดําเนินการใดๆ เกี่ยวกับการเลิกใช้งานนี้ หากใช้การแสดงที่อยู่ IP แบบวนซ้ําในไคลเอ็นต์ OAuth ของแอปเดสก์ท็อปอยู่ ระบบจะรองรับการใช้งานกับประเภทไคลเอ็นต์ OAuth ดังกล่าวต่อไป
วิธีตรวจสอบว่าแอปของคุณใช้ขั้นตอนที่อยู่ IP แบบวนซ้ําอยู่หรือไม่
ตรวจสอบโค้ดของแอปหรือ การเรียกใช้เครือข่ายขาออก (ในกรณีที่แอปของคุณใช้ไลบรารี OAuth) เพื่อระบุว่าการให้สิทธิ์ Google OAuth การขอสิทธิ์ การวนกลับของ URI กําลังใช้ URI ของแอปหรือไม่ คือการใช้ URI ย้อนกลับ
ตรวจสอบโค้ดของแอปพลิเคชัน
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 แบบวนซ้ํากับไคลเอ็นต์ OAuth ประเภท Android หรือ iOS คุณควรย้ายข้อมูลไปยัง SDK อุปกรณ์เคลื่อนที่สําหรับ Google Sign-In (Android, iOS)
SDK นี้ช่วยให้เข้าถึง Google API และจัดการการเรียกทั้งหมดไปยังปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google ได้อย่างง่ายดาย
ลิงก์เอกสารประกอบด้านล่างมีวิธีการใช้ SDK การลงชื่อเข้าใช้ Google เพื่อเข้าถึง Google API โดยไม่ต้องใช้ URI การเปลี่ยนเส้นทางที่อยู่ IP ที่มีการวนกลับ
เข้าถึง Google API ใน Android
การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
ตัวอย่างด้านล่างแสดงวิธีเข้าถึง Google API ในฝั่งเซิร์ฟเวอร์บน 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 API จากฝั่งเซิร์ฟเวอร์ได้ในคําแนะนําการเข้าถึงฝั่งเซิร์ฟเวอร์
เข้าถึง Google API ในแอป iOS
สิทธิ์เข้าถึงฝั่งไคลเอ็นต์
ตัวอย่างด้านล่างแสดงวิธีเข้าถึง Google API ในฝั่งไคลเอ็นต์บน 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 API ในฝั่งไคลเอ็นต์ได้จากคู่มือการเข้าถึงฝั่งไคลเอ็นต์ เกี่ยวกับวิธีเข้าถึง Google API ในฝั่งไคลเอ็นต์
การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
ตัวอย่างด้านล่างแสดงวิธีเข้าถึง 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 API จากฝั่งเซิร์ฟเวอร์ได้ในคําแนะนําการเข้าถึงฝั่งเซิร์ฟเวอร์
ไคลเอ็นต์แอป Chrome
หากพบว่าแอปใช้ขั้นตอนที่อยู่ IP แบบวนซ้ําในไคลเอ็นต์ของแอป Chrome คุณควรย้ายข้อมูลไปยัง Chrome Identity API
ตัวอย่างด้านล่างแสดงวิธีรับรายชื่อติดต่อของผู้ใช้ทั้งหมดโดยไม่ใช้ URI การเปลี่ยนเส้นทางที่อยู่ IP แบบวนซ้ํา
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