คู่มือการย้ายข้อมูลโฟลว์ IP ของ Loopback

ภาพรวม

ในวันที่ 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

กระบวนการย้ายข้อมูลมี 2 ขั้นตอนหลักที่คุณต้องดำเนินการ
  1. ตรวจสอบว่าคุณได้รับผลกระทบหรือไม่
  2. ย้ายข้อมูลไปยังทางเลือกที่รองรับหากคุณได้รับผลกระทบ

ตรวจสอบว่าคุณได้รับผลกระทบหรือไม่

ตรวจสอบประเภทรหัสไคลเอ็นต์ 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 หรือไม่

ตรวจสอบโค้ดของแอปพลิเคชัน

ตรวจสอบส่วนโค้ดแอปพลิเคชันที่คุณใช้เรียก ปลายทางการให้สิทธิ์ของ Google OAuth และพิจารณาว่าพารามิเตอร์ 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
ตัวอย่างคำขอโฟลว์การเปลี่ยนเส้นทางที่อยู่ IP แบบ Loopback จะมีลักษณะดังต่อไปนี้
https://accounts.google.com/o/oauth2/v2/auth?
redirect_uri=http://localhost:3000&
response_type=code&
scope=<SCOPES>&
state=<STATE>&
client_id=<CLIENT_ID>

ตรวจสอบสายที่โทรออกผ่านเครือข่าย

วิธีการตรวจสอบการเรียกเครือข่ายจะแตกต่างกันไปตามประเภทไคลเอ็นต์ของแอปพลิเคชัน
ขณะตรวจสอบการเรียกเครือข่าย ให้มองหาคำขอที่ส่งไปยัง ปลายทางการให้สิทธิ์ของ Google OAuth และตรวจสอบว่าพารามิเตอร์ 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
ตัวอย่างคำขอโฟลว์การเปลี่ยนเส้นทางที่อยู่ IP แบบวนกลับจะมีลักษณะดังนี้
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 จากฝั่งเซิร์ฟเวอร์บน Android
Task<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 ในฝั่งเซิร์ฟเวอร์เพื่อรองรับไคลเอ็นต์ iOS
GIDSignIn.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