ย้ายข้อมูลจาก GoogleAuthUtil และ Plus.API

หากคุณผสานรวมกับ Google Sign-In ในอดีตโดยใช้ GoogleAuthUtil.getToken หรือ Plus.API คุณควรเปลี่ยนไปใช้ API การลงชื่อเข้าใช้ใหม่ล่าสุดเพื่อความปลอดภัยยิ่งขึ้นและประสบการณ์ของผู้ใช้ที่ดียิ่งขึ้น

ย้ายข้อมูลจากรูปแบบป้องกันโทเค็นเพื่อการเข้าถึง

คุณไม่ควรส่งโทเค็นเพื่อการเข้าถึงที่ได้รับพร้อมกับ GoogleAuthUtil.getToken ไปยังเซิร์ฟเวอร์แบ็กเอนด์เพื่อเป็นการยืนยันข้อมูลประจำตัว เนื่องจากคุณจะไม่สามารถยืนยันได้ว่าออกโทเค็นให้กับแบ็กเอนด์หรือไม่ ทำให้คุณเสี่ยงต่อการแทรกโทเค็นเพื่อการเข้าถึงจากผู้โจมตี

เช่น หากโค้ด Android มีลักษณะเหมือนตัวอย่างด้านล่าง คุณควรย้ายแอปไปใช้แนวทางปฏิบัติแนะนำในปัจจุบัน

รหัส 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 หรือ Contacts ให้ใช้ขั้นตอนรหัสการให้สิทธิ์ของเซิร์ฟเวอร์

หากต้องการย้ายข้อมูลไปยังขั้นตอนการใช้รหัสการตรวจสอบสิทธิ์ของเซิร์ฟเวอร์ ให้ทําการเปลี่ยนแปลงต่อไปนี้

ฝั่งไคลเอ็นต์ของ 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);
}

ย้ายข้อมูลจากขั้นตอนโทเค็นรหัส GoogleAuthUtill

หากใช้ GoogleAuthUtil เพื่อรับโทเค็นรหัส คุณควรย้ายข้อมูลไปยังขั้นตอนโทเค็นรหัสใหม่ของ Sign-In API

เช่น หากโค้ด Android มีลักษณะเหมือนตัวอย่างต่อไปนี้ คุณควรย้ายข้อมูล

รหัส Android

ในตัวอย่างนี้ คำขอโทเค็นรหัสใช้ audience:server:client_id บวกกับรหัสไคลเอ็นต์สำหรับเว็บเซิร์ฟเวอร์ของคุณเป็นพารามิเตอร์ "ขอบเขต" สำหรับการเรียก GoogleAuthUtil.getToken (audience:server:client_id:9414861317621.apps.googleusercontent.com)

ขั้นตอนโทเค็นรหัส Sign-In API ใหม่มีประโยชน์ดังต่อไปนี้

  • ประสบการณ์การลงชื่อเข้าใช้ที่คล่องตัวด้วยการแตะเพียงครั้งเดียว
  • เซิร์ฟเวอร์ของคุณจะรับข้อมูลโปรไฟล์ผู้ใช้ได้โดยไม่ต้องเรียกใช้เครือข่ายเพิ่มเติม

หากต้องการย้ายข้อมูลไปยังโฟลว์โทเค็นรหัส ให้ทําการเปลี่ยนแปลงต่อไปนี้

ฝั่งไคลเอ็นต์ของ Android

  • นําสิทธิ์ GET_ACCOUNTS (รายชื่อติดต่อ) ออกหากคุณขอ
  • เปลี่ยนโค้ดโดยใช้ GoogleAuthUtil, Plus.API, AccountPicker.newChooseAccountIntent() หรือ AccountManager.newChooseAccountIntent() เป็น Auth.GOOGLE_SIGN_IN_API ด้วยการกำหนดค่า GoogleSignInOptions.Builder.requestIdToken(...)

ฝั่งเซิร์ฟเวอร์

Sign-In API ใหม่ออกโทเค็นรหัสที่สอดคล้องกับข้อกำหนดของ OpenID Connect ซึ่งต่างจาก GoogleAuthUtil.getToken ซึ่งใช้รูปแบบที่เลิกใช้งานแล้ว โดยเฉพาะอย่างยิ่ง ผู้ออกบัตรตอนนี้คือ https://accounts.google.com พร้อมสคีมา https

ในระหว่างขั้นตอนการย้ายข้อมูล เซิร์ฟเวอร์ของคุณต้องยืนยันโทเค็นรหัสจากไคลเอ็นต์ Android ทั้งเก่าและใหม่ หากต้องการยืนยันโทเค็นทั้งสองรูปแบบ ให้ทำการเปลี่ยนแปลงที่สอดคล้องกับไลบรารีของไคลเอ็นต์ที่คุณใช้ (หากใช้โทเค็น)

  • Java (ไลบรารีของไคลเอ็นต์ Google APIs): อัปเกรดเป็น 1.21.0 ขึ้นไป
  • PHP (ไลบรารีของไคลเอ็นต์ Google APIs): หากคุณใช้ v1 ให้อัปเกรดเป็น 1.1.6 หรือใหม่กว่า หากคุณใช้ v2 ให้อัปเกรดเป็น 2.0.0-RC1 หรือใหม่กว่า
  • Node.js: อัปเกรดเป็น 0.9.7 ขึ้นไป
  • Python หรือการติดตั้งใช้งานของคุณเอง: ยอมรับผู้ออกทั้ง 2 รายนี้: https://accounts.google.com และ accounts.google.com

ย้ายข้อมูลจากขั้นตอนการใช้รหัสการให้สิทธิ์ของเซิร์ฟเวอร์ GoogleAuthUtill

หากใช้ GoogleAuthUtil เพื่อรับรหัสการให้สิทธิ์ของเซิร์ฟเวอร์ คุณควรย้ายข้อมูลไปยังขั้นตอนรหัสการให้สิทธิ์แบบใหม่ของ Sign-In API

เช่น หากโค้ด Android มีลักษณะเหมือนตัวอย่างต่อไปนี้ คุณควรย้ายข้อมูล

รหัส Android

ในตัวอย่างนี้ คำขอรหัสการให้สิทธิ์ของเซิร์ฟเวอร์ใช้ oauth2:server:client_id + รหัสไคลเอ็นต์สำหรับเว็บเซิร์ฟเวอร์ของคุณเป็นพารามิเตอร์ scope สำหรับการเรียก GoogleAuthUtil.getToken (oauth2:server:client_id:9414861317621.apps.googleusercontent.com)

ขั้นตอนใหม่สำหรับรหัสการให้สิทธิ์ของ Sign-In 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);
...