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

ภาพรวม

เมื่อวันที่ 16 กุมภาพันธ์ 2022 เราได้ ประกาศแผนที่จะทำให้การโต้ตอบของ Google OAuth ปลอดภัยขึ้นโดยใช้ขั้นตอน OAuth ที่มีความปลอดภัยมากขึ้น คำแนะนำนี้ช่วยให้คุณเข้าใจการเปลี่ยนแปลงที่จำเป็นและขั้นตอนการย้ายข้อมูลจากโฟลว์ที่อยู่ IP แบบ Loopback ไปยังทางเลือกที่รองรับได้สำเร็จ

ความพยายามนี้เป็นมาตรการป้องกันฟิชชิงและการโจมตีแบบแอบอ้างเป็นแอป ในระหว่างการโต้ตอบกับปลายทางการให้สิทธิ์ 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 การเปลี่ยนเส้นทางแอปอยู่หรือไม่)

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

ตรวจสอบส่วนโค้ดของแอปพลิเคชันที่คุณกำลังเรียกใช้ ปลายทางการให้สิทธิ์ของ 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 แบบ 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>

ย้ายข้อมูลไปยังทางเลือกที่รองรับ

ไคลเอ็นต์อุปกรณ์เคลื่อนที่ (Android / iOS)

หากคิดว่าแอปใช้โฟลว์ที่อยู่ IP แบบ Loopback กับประเภทไคลเอ็นต์ OAuth ของ Android หรือ iOS คุณควรย้ายข้อมูลไปยัง SDK อุปกรณ์เคลื่อนที่ของ Google Sign-In (Android, iOS)

SDK ช่วยให้เข้าถึง Google API ได้ง่ายขึ้นและจัดการการเรียกใช้ทั้งหมดไปยังปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google

ลิงก์เอกสารประกอบด้านล่างนี้ให้ข้อมูลเกี่ยวกับวิธีใช้ SDK ของ Google Sign-In เพื่อเข้าถึง Google API โดยไม่ต้องใช้ 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) หรือใช้ผู้ให้สิทธิ์โปรแกรม Googlebot จำลอง (GTMFetcherAuthorizationProtocol) กับ ไลบรารีของไคลเอ็นต์ Google APIs สำหรับ Objective-C สําหรับ REST

อ่านคู่มือการเข้าถึงฝั่งไคลเอ็นต์เกี่ยวกับวิธีเข้าถึง Google APIs ในฝั่งไคลเอ็นต์ เกี่ยวกับวิธีเข้าถึง Google APIs ในฝั่งไคลเอ็นต์

การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
ตัวอย่างด้านล่างแสดงวิธีเข้าถึง Google API ในฝั่งเซิร์ฟเวอร์เพื่อรองรับไคลเอ็นต์ 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