使用 OAuth 提供方对象进行 Firebase 身份验证。请注意,与其他 FirebaseAuth 操作不同,此操作会弹出自定义 Chrome 标签页,从而控制您的界面。因此,请不要在您附加的 OnSuccessListener 和 OnFailureListener 中引用您的 Activity,因为当该操作启动界面时,它们会立即分离。
您应该首先检查是否已收到响应。通过这种方法登录时,您的 Activity 将位于后台,这意味着系统可以在登录流程中将其回收。为了确保发生这种情况时不让用户进行重试,您应该检查结果是否已经存在。
如需检查是否存在待处理的结果,请调用 getPendingAuthResult:
Task pendingResultTask = firebaseAuth.getPendingAuthResult();
if (pendingResultTask != null) {
// There's something already here! Finish the sign-in for your user.
pendingResultTask
.addOnSuccessListener(
new OnSuccessListener() {
@Override
public void onSuccess(AuthResult authResult) {
// User is signed in.
// IdP data available in
// authResult.getAdditionalUserInfo().getProfile().
// The OAuth access token can also be retrieved:
// authResult.getCredential().getAccessToken().
// The OAuth ID token can also be retrieved:
// authResult.getCredential().getIdToken().
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle failure.
}
});
} else {
// There's no pending result so you need to start the sign-in flow.
// See below.
}
如需启动登录流程,请调用 startActivityForSignInWithProvider:
firebaseAuth
.startActivityForSignInWithProvider(/* activity= */ this, provider.build())
.addOnSuccessListener(
new OnSuccessListener() {
@Override
public void onSuccess(AuthResult authResult) {
// User is signed in.
// IdP data available in
// authResult.getAdditionalUserInfo().getProfile().
// The OAuth access token can also be retrieved:
// authResult.getCredential().getAccessToken().
// The OAuth ID token can also be retrieved:
// authResult.getCredential().getIdToken().
}
})
.addOnFailureListener(
new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
// Handle failure.
}
});
成功完成后,可以从返回的 OAuthCredential 对象检索与提供方关联的 OAuth 访问令牌。
使用 OAuth 访问令牌,您可以调用 Microsoft Graph API。
与 Firebase Authentication 支持的其他提供方不同,Microsoft 不提供照片网址,您必须通过 Microsoft Graph API 来请求个人资料照片的二进制数据。
除了 OAuth 访问令牌,您还可以从 OAuthCredential 对象检索用户的 OAuth ID 令牌。ID 令牌中的 sub 声明取决于具体应用,该声明与 Firebase Auth 所使用的可通过 user.getProviderData().get(0).getUid() 访问的联合用户标识不匹配。应改用 oid 声明字段。使用 Azure AD 租户登录时,oid 声明将完全匹配。不过,对于非租户,系统将填充 oid 字段。对于联合 ID 4b2eabcdefghijkl,oid 的格式为 00000000-0000-0000-4b2e-abcdefghijkl。