อนุญาตการเข้าถึงข้อมูลผู้ใช้ Google

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

การเรียกใช้การตรวจสอบสิทธิ์และการให้สิทธิ์ต้องเป็นโฟลว์ที่แยกกันและแตกต่างกัน 2 รายการตามความต้องการของแอป

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

คุณควรขอสิทธิ์เข้าถึงขอบเขตที่จำเป็นในการเข้าถึง Google API ก็ต่อเมื่อผู้ใช้ดำเนินการที่ต้องเข้าถึง API เฉพาะ เช่น คุณควรขอสิทธิ์เข้าถึงไดรฟ์ของผู้ใช้ทุกครั้งที่ผู้ใช้แตะปุ่มบันทึกลงในไดรฟ์

การแยกการให้สิทธิ์จากการตรวจสอบสิทธิ์จะช่วยหลีกเลี่ยงไม่ให้ผู้ใช้ใหม่รู้สึกว่ามีข้อมูลมากเกินไป หรือไม่ให้ผู้ใช้สับสนว่าทำไมระบบจึงขอสิทธิ์บางอย่าง

สำหรับการตรวจสอบสิทธิ์ เราขอแนะนำให้ใช้ Credential Manager API สำหรับการให้สิทธิ์การดำเนินการที่ต้องเข้าถึงข้อมูลผู้ใช้ที่ Google จัดเก็บไว้ เราขอแนะนำให้ใช้ AuthorizationClient

ตั้งค่าโปรเจ็กต์คอนโซล Google Cloud

  1. เปิดโปรเจ็กต์ใน Cloud Console, หรือสร้างโปรเจ็กต์หากยังไม่มี
  2. ในหน้าการสร้างแบรนด์ ให้ตรวจสอบว่าข้อมูลทั้งหมดสมบูรณ์และถูกต้อง
    1. ตรวจสอบว่าแอปมีชื่อแอป โลโก้แอป และหน้าแรกของแอปที่ถูกต้อง ระบบจะแสดงค่าเหล่านี้ต่อผู้ใช้ในหน้าจอขอความยินยอมในการลงชื่อเข้าใช้ด้วย Google เมื่อลงชื่อสมัครใช้ และหน้าจอแอปและบริการของบุคคลที่สาม
    2. ตรวจสอบว่าคุณได้ระบุ URL ของนโยบายความเป็นส่วนตัวและข้อกำหนดในการให้บริการของแอปแล้ว
  3. ในหน้า ไคลเอ็นต์ ให้สร้างรหัสไคลเอ็นต์ Android สำหรับแอปหากยังไม่มี คุณจะต้องระบุชื่อแพ็กเกจและลายเซ็น SHA-1 ของแอป
    1. ไปที่หน้า ไคลเอ็นต์
    2. คลิกสร้างไคลเอ็นต์
    3. เลือกประเภทแอปพลิเคชัน Android
    4. ป้อนชื่อสำหรับไคลเอ็นต์ OAuth ชื่อนี้จะแสดงในหน้า ไคลเอ็นต์ของโปรเจ็กต์เพื่อระบุไคลเอ็นต์
    5. ป้อนชื่อแพ็กเกจของแอป Android ค่านี้กำหนดไว้ใน package แอตทริบิวต์ขององค์ประกอบ <manifest> ในไฟล์ AndroidManifest.xml
    6. ป้อนลายนิ้วมือของใบรับรองการลงนาม SHA-1 ของ App Distribution
    7. หากแอปใช้ App Signing โดย Google Play, ให้คัดลอกลายนิ้วมือ SHA-1 จากหน้า App Signing ของ Play Console
    8. หากคุณจัดการคลังคีย์และคีย์การลงนามด้วยตนเอง ให้ใช้ยูทิลิตี keytool ที่มาพร้อมกับ Java เพื่อพิมพ์ข้อมูลใบรับรองในรูปแบบที่มนุษย์อ่านได้ คัดลอกค่า SHA-1 ในส่วน Certificate fingerprints ของเอาต์พุต keytool ดูข้อมูลเพิ่มเติมได้ที่ การตรวจสอบสิทธิ์ไคลเอ็นต์ ในเอกสารประกอบ Google APIs for Android
    9. (ไม่บังคับ) ยืนยันการเป็นเจ้าของแอปพลิเคชัน Android
  4. ในหน้า ไคลเอ็นต์ ให้สร้างรหัสไคลเอ็นต์ "เว็บแอปพลิเคชัน" ใหม่หากยังไม่ได้สร้าง คุณสามารถข้ามช่อง "ต้นทาง JavaScript ที่ได้รับอนุญาต" และ "URI การเปลี่ยนเส้นทางที่ได้รับอนุญาต" ไปก่อนได้ ระบบจะใช้รหัสไคลเอ็นต์นี้เพื่อระบุเซิร์ฟเวอร์แบ็กเอนด์เมื่อสื่อสารกับบริการตรวจสอบสิทธิ์ของ Google
    1. ไปที่หน้า ไคลเอ็นต์
    2. คลิกสร้างไคลเอ็นต์
    3. เลือกประเภทเว็บแอปพลิเคชัน

ยืนยันการเป็นเจ้าของแอป

คุณสามารถยืนยันการเป็นเจ้าของแอปพลิเคชันเพื่อลดความเสี่ยงของการแอบอ้างเป็นแอป

หากต้องการดำเนินการตามขั้นตอนการยืนยันให้เสร็จสมบูรณ์ คุณสามารถใช้ บัญชีนักพัฒนาแอป Google Play หากมี และแอปของคุณลงทะเบียน ใน Google Play Console คุณต้องมีคุณสมบัติตรงตามข้อกำหนดต่อไปนี้เพื่อให้การยืนยันสำเร็จ

  • คุณต้องมีแอปพลิเคชันที่ลงทะเบียนใน Google Play Console ที่มีชื่อแพ็กเกจและลายนิ้วมือของใบรับรองการลงนาม SHA-1 เดียวกับไคลเอ็นต์ Android OAuth ที่คุณกำลังดำเนินการยืนยัน
  • คุณต้องมีสิทธิ์ระดับผู้ดูแลระบบ สำหรับแอปใน Google Play Console ดูข้อมูลเพิ่มเติม เกี่ยวกับการจัดการสิทธิ์เข้าถึงใน Google Play Console

ในส่วนยืนยันการเป็นเจ้าของแอป ของไคลเอ็นต์ Android ให้คลิกปุ่มยืนยันการเป็นเจ้าของ เพื่อดำเนินการตามขั้นตอนการยืนยันให้เสร็จสมบูรณ์

หากการยืนยันสำเร็จ ระบบจะแสดงการแจ้งเตือนเพื่อยืนยันความสำเร็จของขั้นตอนการยืนยัน มิฉะนั้น ระบบจะแสดงข้อความแจ้งข้อผิดพลาด

หากต้องการแก้ไขการยืนยันที่ไม่สำเร็จ ให้ลองทำดังนี้

  • ตรวจสอบว่าแอปที่คุณกำลังยืนยันเป็นแอปที่ลงทะเบียนใน Google Play Console
  • ตรวจสอบว่าคุณมีสิทธิ์ระดับผู้ดูแลระบบ สำหรับแอปใน Google Play Console

ประกาศทรัพยากร Dependency

ในไฟล์ build.gradle ของโมดูล ให้ประกาศทรัพยากร Dependency โดยใช้ไลบรารี Google Identity Services เวอร์ชันล่าสุด

dependencies {
  // ... other dependencies

  implementation "com.google.android.gms:play-services-auth:21.5.1"
}

ขอสิทธิ์ที่การดำเนินการของผู้ใช้ต้องใช้

เมื่อใดก็ตามที่ผู้ใช้ดำเนินการที่ต้องใช้ขอบเขตเพิ่มเติม ให้เรียกใช้ AuthorizationClient.authorize() ตัวอย่างเช่น หากผู้ใช้ดำเนินการที่ต้องเข้าถึงพื้นที่เก็บข้อมูลของแอปไดรฟ์ ให้ทำดังนี้

Kotlin

val requestedScopes: List<Scope> = listOf(DriveScopes.DRIVE_FILE)
val authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .build()

Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequestBuilder.build())
    .addOnSuccessListener { authorizationResult ->
        if (authorizationResult.hasResolution()) {
            val pendingIntent = authorizationResult.pendingIntent
            // Access needs to be granted by the user
            startAuthorizationIntent.launch(IntentSenderRequest.Builder(pendingIntent!!.intentSender).build())
        } else {
            // Access was previously granted, continue with user action
            saveToDriveAppFolder(authorizationResult);
        }
    }
    .addOnFailureListener { e -> Log.e(TAG, "Failed to authorize", e) }

Java

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_FILE);
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .build();

Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener(authorizationResult -> {
        if (authorizationResult.hasResolution()) {
            // Access needs to be granted by the user
            startAuthorizationIntent.launch(
                new IntentSenderRequest.Builder(
                    authorizationResult.getPendingIntent().getIntentSender()
                ).build()
            );
        } else {
            // Access was previously granted, continue with user action
            saveToDriveAppFolder(authorizationResult);
        }
    })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize", e));

เมื่อกำหนด ActivityResultLauncher ให้จัดการการตอบกลับตามที่แสดงในข้อมูลโค้ดต่อไปนี้ ซึ่งเราจะถือว่าดำเนินการใน Fragment โค้ดจะตรวจสอบว่ามีการให้สิทธิ์ที่จำเป็นเรียบร้อยแล้ว จากนั้นจึงดำเนินการของผู้ใช้

Kotlin

private lateinit var startAuthorizationIntent: ActivityResultLauncher<IntentSenderRequest>

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    // ...
    startAuthorizationIntent =
        registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
            try {
                // extract the result
                val authorizationResult = Identity.getAuthorizationClient(requireContext())
                    .getAuthorizationResultFromIntent(activityResult.data)
                // continue with user action
                saveToDriveAppFolder(authorizationResult);
            } catch (e: ApiException) {
                // log exception
            }
        }
}

Java

private ActivityResultLauncher<IntentSenderRequest> startAuthorizationIntent;

@Override
public View onCreateView(
    @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
// ...
startAuthorizationIntent =
    registerForActivityResult(
        new ActivityResultContracts.StartIntentSenderForResult(),
        activityResult -> {
            try {
            // extract the result
            AuthorizationResult authorizationResult =
                Identity.getAuthorizationClient(requireActivity())
                    .getAuthorizationResultFromIntent(activityResult.getData());
            // continue with user action
            saveToDriveAppFolder(authorizationResult);
            } catch (ApiException e) {
            // log exception
            }
        });
}

หากคุณเข้าถึง Google API ในฝั่งเซิร์ฟเวอร์ ให้เรียกใช้เมธอด getServerAuthCode() จาก AuthorizationResult เพื่อรับรหัสการให้สิทธิ์ ซึ่งคุณจะส่งไปยังแบ็กเอนด์เพื่อแลกเป็นโทเค็นเพื่อการเข้าถึงและ โทเค็นการรีเฟรช ดูข้อมูลเพิ่มเติมได้ที่ รักษาสิทธิ์เข้าถึงข้อมูลของผู้ใช้ไว้

เพิกถอนสิทธิ์เข้าถึงข้อมูลผู้ใช้หรือทรัพยากร

หากต้องการเพิกถอนสิทธิ์เข้าถึงที่ให้ไว้ก่อนหน้านี้ ให้เรียกใช้ AuthorizationClient.revokeAccess() ตัวอย่างเช่น หากผู้ใช้กำลังนำบัญชีออกจากแอปของคุณ และก่อนหน้านี้แอปของคุณได้รับสิทธิ์เข้าถึง DriveScopes.DRIVE_FILE ให้ใช้โค้ดต่อไปนี้เพื่อเพิกถอนสิทธิ์เข้าถึง

Kotlin

val requestedScopes: MutableList<Scope> = mutableListOf(DriveScopes.DRIVE_FILE)
RevokeAccessRequest revokeAccessRequest = RevokeAccessRequest.builder()
    .setAccount(account)
    .setScopes(requestedScopes)
    .build()

Identity.getAuthorizationClient(activity)
    .revokeAccess(revokeAccessRequest)
    .addOnSuccessListener { Log.i(TAG, "Successfully revoked access") }
    .addOnFailureListener { e -> Log.e(TAG, "Failed to revoke access", e) }

Java

List<Scopes> requestedScopes = Arrays.asList(DriveScopes.DRIVE_FILE);
RevokeAccessRequest revokeAccessRequest = RevokeAccessRequest.builder()
    .setAccount(account)
    .setScopes(requestedScopes)
    .build();

Identity.getAuthorizationClient(activity)
    .revokeAccess(revokeAccessRequest)
    .addOnSuccessListener(unused -> Log.i(TAG, "Successfully revoked access"))
    .addOnFailureListener(e -> Log.e(TAG, "Failed to revoke access", e));

ล้างแคชโทเค็น

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

Kotlin

Identity.getAuthorizationClient(activity)
    .clearToken(ClearTokenRequest.builder().setToken(invalidAccessToken).build())
    .addOnSuccessListener { Log.i(TAG, "Successfully removed the token from the cache") }
    .addOnFailureListener{ e -> Log.e(TAG, "Failed to clear token", e) }

Java

Identity.getAuthorizationClient(activity)
    .clearToken(ClearTokenRequest.builder().setToken(invalidAccessToken).build())
    .addOnSuccessListener(unused -> Log.i(TAG, "Successfully removed the token from the cache"))
    .addOnFailureListener(e -> Log.e(TAG, "Failed to clear the token cache", e));

รับข้อมูลผู้ใช้ระหว่างการให้สิทธิ์

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

  • ลงชื่อเข้าใช้ผู้ใช้ด้วยบัญชี Google โดยใช้ Credential Manager API ก่อนขอการให้สิทธิ์ การตอบกลับการตรวจสอบสิทธิ์ จาก Credential Manager จะมีข้อมูลผู้ใช้ เช่น อีเมล และยังตั้งค่าบัญชีเริ่มต้นของแอปเป็นบัญชีที่เลือกด้วย หาก จำเป็น คุณสามารถติดตามบัญชีนี้ในแอปได้ คำขอการให้สิทธิ์ในภายหลัง จะใช้บัญชีเป็นค่าเริ่มต้นและข้ามขั้นตอนการเลือกบัญชีในโฟลว์การให้สิทธิ์ หากต้องการใช้บัญชีอื่นเพื่อให้สิทธิ์ โปรดดู การให้สิทธิ์จากบัญชีที่ไม่ใช่บัญชีเริ่มต้น

  • ในคำขอการให้สิทธิ์ ให้ขอขอบเขต userinfo, profile และ openid นอกเหนือจากขอบเขตที่ต้องการ (เช่น Drive scope) หลังจากได้รับโทเค็นเพื่อการเข้าถึงแล้ว ให้รับข้อมูลผู้ใช้โดยส่งคำขอ GET HTTP ไปยังปลายทาง Userinfo ของ OAuth (https://www.googleapis.com/oauth2/v3/userinfo) โดยใช้ไลบรารี HTTP ที่ต้องการและใส่โทเค็นเพื่อการเข้าถึงที่ได้รับในส่วนหัว ซึ่งเทียบเท่ากับคำสั่ง curl ต่อไปนี้

    curl -X GET \ "https://www.googleapis.com/oauth2/v1/userinfo?alt=json" \ -H "Authorization: Bearer $TOKEN"
    

    การตอบกลับคือ UserInfo ซึ่งจำกัดไว้เฉพาะขอบเขตที่ ขอและจัดรูปแบบเป็น JSON

การให้สิทธิ์จากบัญชีที่ไม่ใช่บัญชีเริ่มต้น

หากคุณใช้ Credential Manager เพื่อตรวจสอบสิทธิ์และเรียกใช้ AuthorizationClient.authorize() ระบบจะตั้งค่าบัญชีเริ่มต้นของแอปเป็นบัญชีที่ผู้ใช้เลือก ซึ่งหมายความว่าการเรียกใช้เพื่อ การให้สิทธิ์ในภายหลังจะใช้บัญชีเริ่มต้นนี้ หากต้องการบังคับให้แสดงตัวเลือกบัญชี ให้ นำผู้ใช้ออกจากระบบแอปโดยใช้ API clearCredentialState() จาก Credential Manager

รักษาสิทธิ์เข้าถึงข้อมูลของผู้ใช้ไว้

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

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

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

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

Kotlin

// Ask for offline access during the first authorization request
val authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .requestOfflineAccess(serverClientId)
    .build()

Identity.getAuthorizationClient(activity)
    .authorize(authorizationRequest)
    .addOnSuccessListener { authorizationResult ->
        startAuthorizationIntent.launch(IntentSenderRequest.Builder(
            pendingIntent!!.intentSender
        ).build())
    }
    .addOnFailureListener { e -> Log.e(TAG, "Failed to authorize", e) }

Java

// Ask for offline access during the first authorization request
AuthorizationRequest authorizationRequest = AuthorizationRequest.builder()
    .setRequestedScopes(requestedScopes)
    .requestOfflineAccess(serverClientId)
    .build();

Identity.getAuthorizationClient(getContext())
    .authorize(authorizationRequest)
    .addOnSuccessListener(authorizationResult -> {
        startAuthorizationIntent.launch(
            new IntentSenderRequest.Builder(
                authorizationResult.getPendingIntent().getIntentSender()
            ).build()
        );
    })
    .addOnFailureListener(e -> Log.e(TAG, "Failed to authorize"));

ข้อมูลโค้ดต่อไปนี้จะถือว่าการให้สิทธิ์เริ่มต้นจาก Fragment

Kotlin

private lateinit var startAuthorizationIntent: ActivityResultLauncher<IntentSenderRequest>

override fun onCreateView(
    inflater: LayoutInflater,
    container: ViewGroup?,
    savedInstanceState: Bundle?,
): View? {
    // ...
    startAuthorizationIntent =
        registerForActivityResult(ActivityResultContracts.StartIntentSenderForResult()) { activityResult ->
            try {
                val authorizationResult = Identity.getAuthorizationClient(requireContext())
                    .getAuthorizationResultFromIntent(activityResult.data)
                // short-lived access token
                accessToken = authorizationResult.accessToken
                // store the authorization code used for getting a refresh token safely to your app's backend server
                val authCode: String = authorizationResult.serverAuthCode
                storeAuthCodeSafely(authCode)
            } catch (e: ApiException) {
                // log exception
            }
        }
}

Java

private ActivityResultLauncher<IntentSenderRequest> startAuthorizationIntent;

@Override
public View onCreateView(
    @NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // ...
    startAuthorizationIntent =
        registerForActivityResult(
            new ActivityResultContracts.StartIntentSenderForResult(),
            activityResult -> {
                try {
                    AuthorizationResult authorizationResult =
                        Identity.getAuthorizationClient(requireActivity())
                            .getAuthorizationResultFromIntent(activityResult.getData());
                    // short-lived access token
                    accessToken = authorizationResult.getAccessToken();
                    // store the authorization code used for getting a refresh token safely to your app's backend server
                    String authCode = authorizationResult.getServerAuthCode()
                    storeAuthCodeSafely(authCode);
                } catch (ApiException e) {
                    // log exception
                }
            });
}