คําแนะนําในการย้ายข้อมูลที่อยู่ IP ของ Loopback

ภาพรวม

เมื่อวันที่ 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
คุณต้องทําตามขั้นตอนหลักๆ 2 ขั้นตอนเพื่อให้ผ่านขั้นตอนการย้ายข้อมูล ดังนี้
  1. ตรวจสอบว่าได้รับผลกระทบหรือไม่
  2. ย้ายข้อมูลไปยังทางเลือกที่รองรับหากได้รับผลกระทบ

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

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

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

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

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

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