ภาพรวม
ในวันที่ 16 กุมภาพันธ์ 2022 เรา ประกาศวางแผนที่จะทําให้การโต้ตอบของ Google OAuth ปลอดภัยยิ่งขึ้นโดยใช้ขั้นตอน OAuth ที่ปลอดภัยมากขึ้น คู่มือนี้ช่วยให้คุณเข้าใจการเปลี่ยนแปลงและขั้นตอนที่จําเป็นในการย้ายข้อมูลจากขั้นตอนนอกย่านความถี่ (OOB) ของ OAuth ไปยังทางเลือกที่รองรับ
การดําเนินการนี้เป็นมาตรการป้องกันการโจมตีแบบฟิชชิงและการปลอมแปลงแอประหว่างการโต้ตอบกับปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google
OOB คืออะไร
OAuth นอกย่านความถี่ (OOB) หรือที่เรียกว่าตัวเลือกคัดลอก/วางด้วยตนเอง คือขั้นตอนเดิมที่ได้รับการพัฒนาเพื่อรองรับไคลเอ็นต์เนทีฟที่ไม่มี URI การเปลี่ยนเส้นทางเพื่อยอมรับข้อมูลรับรองหลังจากที่ผู้ใช้อนุมัติคําขอคํายินยอม OAuth ขั้นตอน OOB ก่อให้เกิดความเสี่ยงจากฟิชชิงระยะไกลและไคลเอ็นต์ต้องย้ายข้อมูลไปยังวิธีอื่นเพื่อป้องกันช่องโหว่นี้เรากําลังเลิกใช้งานขั้นตอน OOB ของไคลเอ็นต์ทุกประเภท ได้แก่ เว็บแอปพลิเคชัน, Android, iOS, Universal Windows Platform (UWP), แอป Chrome, ทีวี และอุปกรณ์อินพุตที่จํากัด แอปในเดสก์ท็อป
วันที่ของการปฏิบัติตามข้อกําหนดที่สําคัญ
- 28 กุมภาพันธ์ 2022 - บล็อกการใช้ OAuth ใหม่สําหรับขั้นตอน OOB
- 5 กันยายน 2022 - ระบบอาจแสดงข้อความเตือนแก่ผู้ใช้ตามคําขอ OAuth ที่ไม่เป็นไปตามข้อกําหนด
- 3 ตุลาคม 2022 - ขั้นตอน OOB เลิกใช้งานแล้วสําหรับไคลเอ็นต์ OAuth ที่สร้างขึ้นก่อนวันที่ 28 กุมภาพันธ์ 2022
- 31 มกราคม 2023 - ไคลเอ็นต์ที่มีอยู่ทั้งหมดจะถูกบล็อก (รวมถึงไคลเอ็นต์ที่ยกเว้น)
ข้อความแสดงข้อผิดพลาดที่แสดงต่อผู้ใช้จะแสดงสําหรับคําขอที่ไม่สอดคล้องกับข้อกําหนด ข้อความนี้จะแจ้งให้ผู้ใช้ทราบว่าแอปถูกบล็อกขณะที่แสดงอีเมลสนับสนุนที่คุณลงทะเบียนไว้ในหน้าจอคํายินยอม OAuth ในคอนโซล Google API
- ตรวจสอบว่าได้รับผลกระทบหรือไม่
- โปรดย้ายข้อมูลไปยังตัวเลือกอื่นที่มีความปลอดภัยมากขึ้นหากคุณได้รับผลกระทบ
ตรวจสอบว่าได้รับผลกระทบหรือไม่
การเลิกใช้งานนี้มีผลกับแอปเวอร์ชันที่ใช้งานจริงเท่านั้น (เช่น แอปที่มีสถานะการเผยแพร่เป็น ใช้งานจริง แอปจะยังทํางานกับ สถานะการเผยแพร่การทดสอบได้ต่อไป
ตรวจสอบสถานะการเผยแพร่ใน OAuth Consent Screen pageของ Google API Console และดําเนินการต่อไปยังขั้นตอนถัดไปหากคุณใช้ ขั้นตอน OOB ในโปรเจ็กต์ที่มีสถานะการเผยแพร่เป็น "ใช้งานจริง"
วิธีตรวจสอบว่าแอปของคุณใช้ขั้นตอน OOB อยู่หรือไม่
ตรวจสอบโค้ดของแอปหรือการเรียกเครือข่ายขาออก (ในกรณีที่แอปใช้ไลบรารี OAuth) เพื่อพิจารณาว่า Google OAuth คําขอการให้สิทธิ์ ค่า OOB ของคุณคือ URI ที่ทําให้แอปของคุณใช้การเปลี่ยนเส้นทางโดยใช้ API ค่าต่างๆ ทําให้ API เปลี่ยนเส้นทางแอปของคุณโดยใช้ค่า OOB เปลี่ยนเส้นทางแอปของคุณหรือไม่
ตรวจสอบโค้ดของแอปพลิเคชัน
redirect_uri
มีค่าใดค่าหนึ่งต่อไปนี้หรือไม่
redirect_uri=urn:ietf:wg:oauth:2.0:oob
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
ตรวจสอบการโทรออกจากเครือข่าย
- เว็บแอปพลิเคชัน - ตรวจสอบกิจกรรมในเครือข่ายบน Chrome
- Android - ตรวจสอบการจราจรของข้อมูลในเครือข่ายด้วยตัวตรวจสอบเครือข่าย
-
แอป Chrome
- ไปที่หน้าส่วนขยาย Chrome
- เลือกช่องทําเครื่องหมายโหมดนักพัฒนาซอฟต์แวร์ที่มุมขวาบนของหน้าส่วนขยาย
- เลือกส่วนขยายที่คุณต้องการตรวจสอบ
- คลิกลิงก์หน้าพื้นหลังในส่วนตรวจสอบการดูของหน้าส่วนขยาย
- ป๊อปอัปเครื่องมือสําหรับนักพัฒนาซอฟต์แวร์จะปรากฏขึ้นเพื่อให้คุณตรวจสอบการจราจรของข้อมูลในเครือข่ายได้ใน แท็บเครือข่าย
- iOS - การวิเคราะห์การเข้าชม HTTP ด้วยเครื่องมือ
- Universal Windows Platform (UWP) - ตรวจสอบการเข้าชมเครือข่ายใน Visual Studio
- แอปบนเดสก์ท็อป - ใช้เครื่องมือบันทึกเครือข่าย สําหรับระบบปฏิบัติการที่แอปพัฒนาให้
redirect_uri
มีค่าใดค่าหนึ่งต่อไปนี้หรือไม่
redirect_uri=urn:ietf:wg:oauth:2.0:oob
redirect_uri=urn:ietf:wg:oauth:2.0:oob:auto
redirect_uri=oob
https://accounts.google.com/o/oauth2/v2/auth? response_type=code& scope=<SCOPES>& state=<STATE>& redirect_uri=urn:ietf:wg:oauth:2.0:oob& client_id=<CLIENT_ID>
ย้ายข้อมูลไปยังตัวเลือกอื่นที่ปลอดภัย
ไคลเอ็นต์มือถือ (แอนดรอยด์ / iOS)
หากคิดว่าแอปของคุณใช้ขั้นตอน OOB กับไคลเอ็นต์ OAuth ประเภท Android หรือ iOS อยู่ คุณควรย้ายข้อมูลไปยัง SDK อุปกรณ์เคลื่อนที่สําหรับ Google Sign-In (Android, iOS)
SDK ช่วยให้เข้าถึง Google APIs และจัดการการเรียกทั้งหมดไปยังปลายทางการให้สิทธิ์ OAuth 2.0 ของ Google ได้อย่างง่ายดาย
ลิงก์เอกสารด้านล่างให้ข้อมูลเกี่ยวกับวิธีใช้ Google Sign-In SDK เพื่อเข้าถึง Google APIs โดยไม่ใช้ URI การเปลี่ยนเส้นทาง OOB
เข้าถึง Google APIs บน 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 API ทางฝั่งเซิร์ฟเวอร์เพื่อสนับสนุนไคลเอ็นต์ 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
หากพิจารณาแล้วว่าแอปกําลังใช้ขั้นตอน OOB ในไคลเอ็นต์แอป Chrome คุณควรย้ายข้อมูลไปยัง Chrome Identity API
ตัวอย่างด้านล่างแสดงวิธีรับรายชื่อติดต่อของผู้ใช้ทั้งหมดโดยไม่ใช้ URI การเปลี่ยนเส้นทาง OOB
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
เว็บแอปพลิเคชัน
หากคุณเห็นว่าแอปใช้ขั้นตอน OOB สําหรับเว็บแอปพลิเคชัน คุณควรย้ายข้อมูลไปยังไลบรารีของไคลเอ็นต์ Google API ของเรา ไลบรารีของไคลเอ็นต์สําหรับภาษาโปรแกรมต่างๆ จะระบุไว้ที่นี่
ไลบรารีช่วยให้คุณเข้าถึง Google APIs และจัดการการเรียกทั้งหมดไปยังปลายทางของ Google ได้อย่างง่ายดาย
การเข้าถึงฝั่งเซิร์ฟเวอร์ (ออฟไลน์)
- ตั้งค่าเซิร์ฟเวอร์และกําหนดปลายทางที่เข้าถึงได้แบบสาธารณะ (URI การเปลี่ยนเส้นทาง) เพื่อรับรหัสการให้สิทธิ์
- กําหนดค่า URI การเปลี่ยนเส้นทาง ใน Credentials page ของ Google API Console
ข้อมูลโค้ดด้านล่างแสดงตัวอย่าง NodeJS ในการใช้ Google Drive API เพื่อแสดงไฟล์ Google ไดรฟ์ของผู้ใช้ในฝั่งเซิร์ฟเวอร์โดยไม่ต้องใช้ URI การเปลี่ยนเส้นทาง OOB
async function main() { const server = http.createServer(async function (req, res) { if (req.url.startsWith('/oauth2callback')) { let q = url.parse(req.url, true).query; if (q.error) { console.log('Error:' + q.error); } else { // Get access and refresh tokens (if access_type is offline) let { tokens } = await oauth2Client.getToken(q.code); oauth2Client.setCredentials(tokens); // Example of using Google Drive API to list filenames in user's Drive. const drive = google.drive('v3'); drive.files.list({ auth: oauth2Client, pageSize: 10, fields: 'nextPageToken, files(id, name)', }, (err1, res1) => { // TODO(developer): Handle response / error. }); } } }
ดูวิธีเข้าถึง Google API จากฝั่งเซิร์ฟเวอร์ได้ใน คําแนะนําเว็บแอปฝั่งเซิร์ฟเวอร์
การเข้าถึงฝั่งไคลเอ็นต์
ข้อมูลโค้ดด้านล่างใน JavaScript แสดงตัวอย่างการใช้ Google API เพื่อเข้าถึงกิจกรรมในปฏิทินของผู้ใช้ฝั่งไคลเอ็นต์
// initTokenClient() initializes a new token client with your // web app's client ID and the scope you need access to const client = google.accounts.oauth2.initTokenClient({ client_id: 'YOUR_GOOGLE_CLIENT_ID', scope: 'https://www.googleapis.com/auth/calendar.readonly', // callback function to handle the token response callback: (tokenResponse) => { if (tokenResponse && tokenResponse.access_token) { gapi.client.setApiKey('YOUR_API_KEY'); gapi.client.load('calendar', 'v3', listUpcomingEvents); } }, }); function listUpcomingEvents() { gapi.client.calendar.events.list(...); }
ดูวิธีเข้าถึง Google APIs จากฝั่งไคลเอ็นต์ได้ที่ คําแนะนําเกี่ยวกับเว็บแอปฝั่งไคลเอ็นต์
ไคลเอ็นต์บนเดสก์ท็อป
หากเห็นว่าแอปกําลังใช้ขั้นตอน OOB ในไคลเอ็นต์เดสก์ท็อป คุณควรเปลี่ยนไปใช้
ขั้นตอนที่อยู่ IP แบบวนซ้ํา (localhost
หรือ 127.0.0.1
)