หากคุณเคยผสานรวมกับ Google Sign-In ในอดีตโดยใช้ GoogleAuthUtil.getToken
หรือ Plus.API
คุณควรเปลี่ยนไปใช้ API การลงชื่อเข้าใช้ใหม่ล่าสุดเพื่อเพิ่มความปลอดภัยและประสบการณ์ของผู้ใช้ที่ดียิ่งขึ้น
ย้ายข้อมูลจากรูปแบบการป้องกันโทเค็นการเข้าถึง
คุณไม่ควรส่งโทเค็นเพื่อการเข้าถึงที่ได้รับกับ GoogleAuthUtil.getToken
ไปยังเซิร์ฟเวอร์แบ็กเอนด์เป็นการยืนยันตัวตน เนื่องจากคุณจะยืนยันไม่ได้ว่ามีการออกโทเค็นนั้นให้กับแบ็กเอนด์อย่างง่ายดาย ซึ่งจะทําให้เสี่ยงต่อการแทรกโทเค็นเพื่อการเข้าถึงจากผู้โจมตี
เช่น หากโค้ด Android มีลักษณะเหมือนตัวอย่างด้านล่าง คุณควรย้ายแอปไปใช้แนวทางปฏิบัติแนะนําในปัจจุบัน
ในตัวอย่าง คําขอโทเค็นเพื่อการเข้าถึงใช้ oauth2:
และสตริงขอบเขตเป็นพารามิเตอร์ scope
สําหรับการเรียก GoogleAuthUtil.getToken
(oauth2:https://www.googleapis.com/auth/plus.login
)
แทนที่จะใช้การตรวจสอบสิทธิ์ด้วยโทเค็นการเข้าถึงที่ได้มาจาก GoogleAuthUtil.getToken
ให้ใช้ขั้นตอนของโทเค็นรหัสหรือโฟลว์ของรหัสการตรวจสอบสิทธิ์
ย้ายข้อมูลไปยังขั้นตอนของโทเค็นรหัส
หากต้องการใช้แค่รหัส อีเมล ชื่อ หรือ URL ของรูปโปรไฟล์ของผู้ใช้ ให้ใช้ขั้นตอนของโทเค็นรหัส
หากต้องการย้ายข้อมูลไปยังโฟลว์โทเค็นรหัส ให้ทําการเปลี่ยนแปลงต่อไปนี้
ฝั่งไคลเอ็นต์ของ Android
- นําสิทธิ์
GET_ACCOUNTS
(รายชื่อติดต่อ) ออกหากคุณร้องขอ - สลับโค้ดโดยใช้
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
หรือAccountManager.newChooseAccountIntent()
เป็นAuth.GOOGLE_SIGN_IN_API
ด้วยการกําหนดค่าGoogleSignInOptions.Builder.requestIdToken(...)
ฝั่งเซิร์ฟเวอร์
- สร้างปลายทางใหม่สําหรับการตรวจสอบสิทธิ์โทเค็นรหัส
- ปิดปลายทางเก่าหลังจากที่ย้ายข้อมูลแอปไคลเอ็นต์แล้ว
ย้ายข้อมูลไปยังโฟลว์รหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์
หากเซิร์ฟเวอร์ต้องการเข้าถึง Google API อื่นๆ เช่น Google ไดรฟ์, YouTube หรือรายชื่อติดต่อ ให้ใช้ขั้นตอนการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์
หากต้องการย้ายข้อมูลโฟลว์ของการตรวจสอบสิทธิ์เซิร์ฟเวอร์ ให้ทําการเปลี่ยนแปลงดังนี้
ฝั่งไคลเอ็นต์ของ Android
- นําสิทธิ์
GET_ACCOUNTS
(รายชื่อติดต่อ) ออกหากคุณร้องขอ - สลับโค้ดโดยใช้
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
หรือAccountManager.newChooseAccountIntent()
เป็นAuth.GOOGLE_SIGN_IN_API
ด้วยการกําหนดค่าGoogleSignInOptions.Builder.requestServerAuthCode(...)
ฝั่งเซิร์ฟเวอร์
- สร้างปลายทางใหม่สําหรับขั้นตอนการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์
- ปิดปลายทางเก่าหลังจากที่ย้ายข้อมูลแอปไคลเอ็นต์แล้ว
คุณยังคงแชร์ตรรกะการเข้าถึง API ระหว่างปลายทางเก่าและปลายทางใหม่ได้ เช่น
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(...); String accessToken = tokenResponse.getAccessToken(); String refreshToken = tokenResponse.getRefreshToken(); Long expiresInSeconds = tokenResponse.getExpiresInSeconds(); // Shared by your old and new implementation, old endpoint can pass null for refreshToken private void driveAccess(String refreshToken, String accessToken, Long expiresInSeconds) { GoogleCredential credential = new GoogleCredential.Builder() .setTransPort(...) ... .build(); credential.setAccessToken(accessToken); credential.setExpiresInSeconds(expiresInSeconds); credential.setRefreshToken(refreshToken); }
ย้ายข้อมูลจากโฟลว์โทเค็นรหัส GoogleAuthUtil
หากใช้ GoogleAuthUtil
เพื่อรับโทเค็นรหัส คุณควรย้ายข้อมูลไปยังขั้นตอนของโทเค็นรหัส API การลงชื่อเข้าใช้ใหม่
เช่น หากโค้ดของ Android มีลักษณะเหมือนตัวอย่างต่อไปนี้ คุณควรจะย้ายข้อมูล
ในตัวอย่าง คําขอโทเค็นรหัสใช้ audience:server:client_id
และรหัสไคลเอ็นต์สําหรับเว็บเซิร์ฟเวอร์เป็นพารามิเตอร์ "ขอบเขต" สําหรับการเรียก GoogleAuthUtil.getToken
(audience:server:client_id:9414861317621.apps.googleusercontent.com
)
ขั้นตอนของโทเค็นรหัส API การลงชื่อเข้าใช้ใหม่มีประโยชน์ดังต่อไปนี้
- ประสบการณ์การลงชื่อเข้าใช้ด้วยการแตะเพียงครั้งเดียวที่มีประสิทธิภาพ
- เซิร์ฟเวอร์ของคุณจะรับข้อมูลโปรไฟล์ผู้ใช้ได้โดยไม่ต้องโทรจากเครือข่าย
หากต้องการย้ายข้อมูลไปยังโฟลว์โทเค็นรหัส ให้ทําการเปลี่ยนแปลงต่อไปนี้
ฝั่งไคลเอ็นต์ของ Android
- นําสิทธิ์
GET_ACCOUNTS
(รายชื่อติดต่อ) ออกหากคุณร้องขอ - สลับโค้ดโดยใช้
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
หรือAccountManager.newChooseAccountIntent()
เป็นAuth.GOOGLE_SIGN_IN_API
ด้วยการกําหนดค่าGoogleSignInOptions.Builder.requestIdToken(...)
ฝั่งเซิร์ฟเวอร์
API การลงชื่อเข้าใช้ใหม่จะออกโทเค็นรหัสที่เป็นไปตามข้อกําหนดของ OpenID Connect ซึ่งต่างจาก GoogleAuthUtil.getToken
ซึ่งใช้รูปแบบที่เลิกใช้งานแล้ว
โดยเฉพาะอย่างยิ่งผู้ออกบัตรคือ https://accounts.google.com
ที่มีสคีมา https
ระหว่างการย้ายข้อมูล เซิร์ฟเวอร์ของคุณจะต้องยืนยันโทเค็นรหัสจากทั้งไคลเอ็นต์ Android ทั้งเก่าและใหม่ หากต้องการยืนยันโทเค็นทั้ง 2 รูปแบบ ให้ทําการเปลี่ยนแปลงตามไลบรารีของไคลเอ็นต์ที่คุณใช้ (หากใช้รูปแบบใดรูปแบบหนึ่ง) ดังนี้
- Java (ไลบรารีของไคลเอ็นต์ Google API): อัปเกรดเป็น 1.21.0 หรือใหม่กว่า
- PHP (ไลบรารีของไคลเอ็นต์ Google API): หากคุณใช้ v1 โปรดอัปเกรดเป็น 1.1.6 หรือใหม่กว่า หากคุณใช้ v2 ให้อัปเกรดเป็น 2.0.0-RC1 หรือใหม่กว่า
- Node.js: อัปเกรดเป็น 0.9.7 หรือใหม่กว่า
- Python หรือการใช้งานของคุณเอง: ยอมรับผู้ออกใบรับรองทั้ง 2 รายนี้
https://accounts.google.com
และaccounts.google.com
ย้ายข้อมูลจากขั้นตอนการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์ GoogleAuthUtil
หากคุณใช้ GoogleAuthUtil
เพื่อรับรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ คุณควรเปลี่ยนไปใช้ขั้นตอนการตรวจสอบสิทธิ์ API การลงชื่อเข้าใช้ใหม่
เช่น หากโค้ดของ Android มีลักษณะเหมือนตัวอย่างต่อไปนี้ คุณควรจะย้ายข้อมูล
ในตัวอย่าง คําขอรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์จะใช้ oauth2:server:client_id
+ รหัสไคลเอ็นต์สําหรับเว็บเซิร์ฟเวอร์เป็นพารามิเตอร์ scope
สําหรับการเรียก GoogleAuthUtil.getToken
(oauth2:server:client_id:9414861317621.apps.googleusercontent.com
)
ขั้นตอนการตรวจสอบสิทธิ์รหัส API การลงชื่อเข้าใช้ใหม่มีประโยชน์ดังต่อไปนี้
- ประสบการณ์การลงชื่อเข้าใช้ด้วยการแตะเพียงครั้งเดียวที่มีประสิทธิภาพ
- หากทําตามคําแนะนําในการย้ายข้อมูลด้านล่าง เซิร์ฟเวอร์จะได้รับโทเค็นรหัส ที่มีข้อมูลโปรไฟล์ของผู้ใช้เมื่อคุณแลกเปลี่ยนโค้ดการตรวจสอบสิทธิ์
หากต้องการย้ายข้อมูลไปยังขั้นตอนการตรวจสอบสิทธิ์แบบใหม่ โปรดทําการเปลี่ยนแปลงต่อไปนี้
ฝั่งไคลเอ็นต์ของ Android
- นําสิทธิ์
GET_ACCOUNTS
(รายชื่อติดต่อ) ออกหากคุณร้องขอ - สลับโค้ดโดยใช้
GoogleAuthUtil
,Plus.API
,AccountPicker.newChooseAccountIntent()
หรือAccountManager.newChooseAccountIntent()
เป็นAuth.GOOGLE_SIGN_IN_API
ด้วยการกําหนดค่าGoogleSignInOptions.Builder.requestServerAuthCode(...)
ฝั่งเซิร์ฟเวอร์
เก็บโค้ดปัจจุบันไว้ แต่ระบุ https://oauth2.googleapis.com/token
เป็นปลายทางของเซิร์ฟเวอร์โทเค็นเมื่อสร้างออบเจ็กต์ GoogleAuthorizationCodeTokenRequest
เพื่อที่คุณจะได้รับโทเค็นรหัสที่มีอีเมล รหัสผู้ใช้ และข้อมูลโปรไฟล์ของผู้ใช้ได้โดยไม่ต้องเรียกใช้เครือข่ายอื่น ปลายทางนี้ใช้ร่วมกันได้อย่างเต็มรูปแบบ และรหัสด้านล่างจะใช้ได้กับรหัสการตรวจสอบสิทธิ์เซิร์ฟเวอร์ที่ดึงมาจากการใช้งานไคลเอ็นต์ Android ทั้งเก่าและใหม่
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest( transport, jsonFactory, // Use below for tokenServerEncodedUrl parameter "https://oauth2.googleapis.com/token", clientSecrets.getDetails().getClientId(), clientSecrets.getDetails().getClientSecret(), authCode, REDIRECT_URI) .execute(); ... // You can also get an ID token from auth code exchange. GoogleIdToken googleIdToken = tokenResponse.parseIdToken(); GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(transport, jsonFactory) .setAudience(Arrays.asList(SERVER_CLIENT_ID)) .setIssuer("https://accounts.google.com") .build(); // Refer to ID token documentation to see how to get data from idToken object. GoogleIdToken idToken = verifier.verify(idTokenString); ...