On every attempt of login and logout, I receive email and user name from apple as long as I have not revoked it. But if I revoke, and then try to login again. In that case, I don't get email/name.
If I delete my apple account from device, and re login from settings. In that case, I get only user name on first login attempt in app. On subsequent logins, I get nothing. What could be possibly wrong with my flow?
My login code is as
import { appleAuth } from '@invertase/react-native-apple-authentication';
import auth from '@react-native-firebase/auth';
const appleAuthRequestResponse = await appleAuth.performRequest({
requestedOperation: appleAuth.Operation.LOGIN,
requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
});
// Ensure Apple returned a user identityToken
if (!appleAuthRequestResponse.identityToken) {
Alert.alert('Error', 'Apple Sign-In failed - no identify token returned');
return;
}
// Create a Firebase credential from the response
const { identityToken, nonce } = appleAuthRequestResponse;
const appleCredential = auth.AppleAuthProvider.credential(identityToken, nonce);
// Sign the user in with the credential
const res = await auth().signInWithCredential(appleCredential);
console.log(res.user.email) // returns email
The revoke code is as follows
import { appleAuth } from '@invertase/react-native-apple-authentication';
import { getAppleAuthorizationToken } from '../firebase/cloudFunctions';
const authTokenJWT = await getAppleAuthorizationToken(); // call to get JWT
appleAuthRequestResponse = await appleAuth.performRequest({
requestedOperation: appleAuth.Operation.LOGIN,
requestedScopes: [appleAuth.Scope.EMAIL, appleAuth.Scope.FULL_NAME],
});
const { authorizationCode } = appleAuthRequestResponse;
const config = {
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
},
};
const authTokenBody = {
client_id: PACKAGE_NAME,
client_secret: authTokenJWT.data.jwt,
code: authorizationCode,
grant_type: 'authorization_code',
};
const generateAuthTokenUrl = 'https://appleid.apple.com/auth/token';
const res1 = await axios.post(generateAuthTokenUrl, authTokenBody, config);
const revokeTokenBody = {
client_id: PACKAGE_NAME,
client_secret: authTokenJWT.data.jwt,
token: res1.data.refresh_token,
token_type_hint: 'refresh_token',
};
const revokeAuthTokenUrl = 'https://appleid.apple.com/auth/revoke';
const res2 = await axios.post(revokeAuthTokenUrl, revokeTokenBody, config);
// res2 is empty with status 200.