การตรวจสอบสิทธิ์จะระบุตัวตนของบุคคล และโดยทั่วไปเรียกว่าการลงชื่อสมัครใช้หรือลงชื่อเข้าใช้ของผู้ใช้ การให้สิทธิ์คือกระบวนการให้หรือปฏิเสธการเข้าถึงข้อมูลหรือทรัพยากร เช่น แอปของคุณขอความยินยอมจากผู้ใช้ในการเข้าถึง Google ไดรฟ์ของผู้ใช้
การเรียกใช้การตรวจสอบสิทธิ์และการให้สิทธิ์ต้องเป็นโฟลว์ที่แยกกันและแตกต่างกัน 2 รายการตามความต้องการของแอป
หากแอปมีฟีเจอร์ที่ใช้ประโยชน์จากข้อมูล Google API ได้ แต่ไม่จำเป็นต้องเป็นส่วนหนึ่งของฟีเจอร์หลักของแอป ให้ออกแบบแอปให้สามารถจัดการกรณีที่เข้าถึงข้อมูล API ไม่ได้ เช่น คุณอาจซ่อนรายการไฟล์ที่บันทึกล่าสุดเมื่อผู้ใช้ไม่ได้ให้สิทธิ์เข้าถึงไดรฟ์
คุณควรขอสิทธิ์เข้าถึงขอบเขตที่จำเป็นในการเข้าถึง Google API ก็ต่อเมื่อผู้ใช้ดำเนินการที่ต้องเข้าถึง API เฉพาะ เช่น คุณควรขอสิทธิ์เข้าถึงไดรฟ์ของผู้ใช้ทุกครั้งที่ผู้ใช้แตะปุ่มบันทึกลงในไดรฟ์
การแยกการให้สิทธิ์จากการตรวจสอบสิทธิ์จะช่วยหลีกเลี่ยงไม่ให้ผู้ใช้ใหม่รู้สึกว่ามีข้อมูลมากเกินไป หรือไม่ให้ผู้ใช้สับสนว่าทำไมระบบจึงขอสิทธิ์บางอย่าง
สำหรับการตรวจสอบสิทธิ์ เราขอแนะนำให้ใช้ Credential Manager API สำหรับการให้สิทธิ์การดำเนินการที่ต้องเข้าถึงข้อมูลผู้ใช้ที่ Google จัดเก็บไว้ เราขอแนะนำให้ใช้ AuthorizationClient
ตั้งค่าโปรเจ็กต์คอนโซล Google Cloud
- เปิดโปรเจ็กต์ใน Cloud Console, หรือสร้างโปรเจ็กต์หากยังไม่มี
- ในหน้าการสร้างแบรนด์
ให้ตรวจสอบว่าข้อมูลทั้งหมดสมบูรณ์และถูกต้อง
- ตรวจสอบว่าแอปมีชื่อแอป โลโก้แอป และหน้าแรกของแอปที่ถูกต้อง ระบบจะแสดงค่าเหล่านี้ต่อผู้ใช้ในหน้าจอขอความยินยอมในการลงชื่อเข้าใช้ด้วย Google เมื่อลงชื่อสมัครใช้ และหน้าจอแอปและบริการของบุคคลที่สาม
- ตรวจสอบว่าคุณได้ระบุ URL ของนโยบายความเป็นส่วนตัวและข้อกำหนดในการให้บริการของแอปแล้ว
- ในหน้า ไคลเอ็นต์
ให้สร้างรหัสไคลเอ็นต์ Android สำหรับแอปหากยังไม่มี คุณจะต้องระบุชื่อแพ็กเกจและลายเซ็น SHA-1 ของแอป
- ไปที่หน้า ไคลเอ็นต์
- คลิกสร้างไคลเอ็นต์
- เลือกประเภทแอปพลิเคชัน Android
- ป้อนชื่อสำหรับไคลเอ็นต์ OAuth ชื่อนี้จะแสดงในหน้า ไคลเอ็นต์ของโปรเจ็กต์เพื่อระบุไคลเอ็นต์
- ป้อนชื่อแพ็กเกจของแอป Android ค่านี้กำหนดไว้ใน
packageแอตทริบิวต์ขององค์ประกอบ<manifest>ในไฟล์AndroidManifest.xml - ป้อนลายนิ้วมือของใบรับรองการลงนาม SHA-1 ของ App Distribution
- หากแอปใช้ App Signing โดย Google Play, ให้คัดลอกลายนิ้วมือ SHA-1 จากหน้า App Signing ของ Play Console
- หากคุณจัดการคลังคีย์และคีย์การลงนามด้วยตนเอง ให้ใช้ยูทิลิตี keytool ที่มาพร้อมกับ Java เพื่อพิมพ์ข้อมูลใบรับรองในรูปแบบที่มนุษย์อ่านได้ คัดลอกค่า
SHA-1ในส่วนCertificate fingerprintsของเอาต์พุต keytool ดูข้อมูลเพิ่มเติมได้ที่ การตรวจสอบสิทธิ์ไคลเอ็นต์ ในเอกสารประกอบ Google APIs for Android - (ไม่บังคับ) ยืนยันการเป็นเจ้าของแอปพลิเคชัน Android
- ในหน้า ไคลเอ็นต์
ให้สร้างรหัสไคลเอ็นต์ "เว็บแอปพลิเคชัน" ใหม่หากยังไม่ได้สร้าง คุณสามารถข้ามช่อง "ต้นทาง JavaScript ที่ได้รับอนุญาต" และ "URI การเปลี่ยนเส้นทางที่ได้รับอนุญาต" ไปก่อนได้ ระบบจะใช้รหัสไคลเอ็นต์นี้เพื่อระบุเซิร์ฟเวอร์แบ็กเอนด์เมื่อสื่อสารกับบริการตรวจสอบสิทธิ์ของ Google
- ไปที่หน้า ไคลเอ็นต์
- คลิกสร้างไคลเอ็นต์
- เลือกประเภทเว็บแอปพลิเคชัน
ยืนยันการเป็นเจ้าของแอป
คุณสามารถยืนยันการเป็นเจ้าของแอปพลิเคชันเพื่อลดความเสี่ยงของการแอบอ้างเป็นแอป
หากต้องการดำเนินการตามขั้นตอนการยืนยันให้เสร็จสมบูรณ์ คุณสามารถใช้ บัญชีนักพัฒนาแอป 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) หลังจากได้รับโทเค็นเพื่อการเข้าถึงแล้ว ให้รับข้อมูลผู้ใช้โดยส่งคำขอGETHTTP ไปยังปลายทาง 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
}
});
}