Android의 Firebase Google Authentication에서 사용자가 처음으로 인증되었는지 확인합니다.
안드로이드 앱에서 파이어베이스 인증을 사용하고 있으며, 앱에 로그인하기 위한 옵션으로 구글 계정 인증을 사용하고 있습니다.
사용자가 애플리케이션에 처음 로그인했는지 여부를 어떻게 알 수 있습니까?
사용자가 처음으로 로그인하는지 여부를 확인하려면 다음 주소로 전화하십시오.AdditionalUserInfo.isNewUser()
의법에 있는 OnCompleteListener.onComplete
콜백
아래 코드 예제에서는 null을 확인해야 합니다.
OnCompleteListener<AuthResult> completeListener = new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
boolean isNew = task.getResult().getAdditionalUserInfo().isNewUser();
Log.d("MyTAG", "onComplete: " + (isNew ? "new user" : "old user"));
}
}
};
자세한 참조는 문서를 확인하십시오.
Firebase-ui 문서에서 마지막 로그인 타임스탬프를 다음과 같이 생성된 타임스탬프와 비교하여 확인할 수 있습니다.
FirebaseUserMetadata metadata = auth.getCurrentUser().getMetadata();
if (metadata.getCreationTimestamp() == metadata.getLastSignInTimestamp()) {
// The user is new, show them a fancy intro screen!
} else {
// This is an existing user, show them a welcome back screen.
}
Firebase auth(16.0.1)의 새 버전에 따르면 AuthResult 클래스에는 true 또는 false(사용자가 새로 온 것인지 여부)를 나타내는 멤버 함수가 있습니다.범위에 "credential"이 정의되어 있다고 가정합니다(Google credential).예는 아래에 나와 있습니다: '
private FirebaseAuth mAuth;
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mAuth = FirebaseAuth.getInstance();
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
GoogleSignInAccount acct = task.getResult(ApiException.class);
AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
Log.d(TAG, "linkWithCredential:success");
boolean newuser = task.getResult().getAdditionalUserInfo().isNewUser();
if(newuser){
//Do Stuffs for new user
}else{
//Continue with Sign up
}
} else {
Toast.makeText(MyClass.this, "Authentication failed.",
Toast.LENGTH_SHORT).show();
}
});
파이어베이스 덕분에:)
웹의 경우 버전 9.0(모듈형):
"getAdditionalUserInfo"를 가져와 다음과 같이 호출해야 합니다.
signInWithPopup(firebaseAuth, provider)
.then((result) => {
const details = getAdditionalUserInfo(result)
console.log(details.isNewUser);
})
.catch((error) => {
console.log(error);
});
반환된 세부 정보에는 "isNewUser" 부울 속성이 포함됩니다.
11부터는 버11.6.0 사있수다를 사용할 수 .AdditionalUserInfo.isNewUser()
https://firebase.google.com/docs/reference/android/com/google/firebase/auth/AdditionalUserInfo
내가 사용한 해결책은...
- Firestore에서 '사용자'라는 이름의 컬렉션을 만들었습니다.
- 누군가가 로그인할 때마다, 그것의 액체를 가져와라.
- '사용자'에서 해당 UID를 검색합니다.'사용자' 문서의 이름을 = 사용자의 UID로 지정해야 합니다.
- 문서가 존재하는 경우 새 사용자, 그렇지 않은 경우
- 그런 다음 해당 사용자의 문서를 해당 '사용자' 컬렉션에 추가합니다.
사용된 트릭 - UID를 사용하여 이 문제를 해결합니다.감사합니다. 도움이 된다면 투표하세요.
Firebase Auth를 Firestore와 함께 사용하는 경우의 솔루션
Firestore 데이터베이스의 루트 아키텍처는 다음과 같습니다.
Auth Firebase currentUser.uid
각 사용자에 대한 루트 문서를 작성합니다.다음 필드를 추가하는 것으로 시작합니다.registered_at
사용자를 처음 작성하는 즉시 루트 문서에 추가한 후 사용 사례에 따라 특정 컬렉션을 루트 문서에 추가합니다.
때, 에 "" "" "" " "" " "" "가 할 수 .registered_at
필드가 이미 있습니다.아직 존재하지 않는 경우 사용자를 새 사용자로 취급할 수 있습니다(사용자가 삭제하거나 변경할 수 없는 경우).registered_at
나중에 필드)
import com.google.firebase.auth.FirebaseAuth
import com.google.firebase.firestore.DocumentReference
import com.google.firebase.firestore.FirebaseFirestore
fun rootDocument(): DocumentReference? = rootPath()?.let {
return fireStore().document(it)
}
fun rootPath(): String? {
val loggedInUser = loggedInUser()
if (loggedInUser != null) {
return "users/${loggedInUser.uid}"
}
return null
}
fun fireStore() = FirebaseFirestore.getInstance()
fun createWriteBatch() = fireStore().batch()
fun loggedInUser() = fireAuth().currentUser
fun fireAuth(): FirebaseAuth = FirebaseAuth.getInstance()
fun afterSignIn() {
val rootDocument = rootDocument()
?: throw IllegalStateException("root document not found")
rootDocument.get().addOnCompleteListener {
val isNewUser = it.result.exists().not()
if (isNewUser) {
val batch = createWriteBatch()
batch.set(rootDocument, HashMap<Any, Any>().apply {
put("registered_at", System.currentTimeMillis())
})
batch.commit().addOnCompleteListener {
println("this is a new user")
}
} else {
println("this is not a new user")
}
}
}
(인증 사용자 테이블에 새 필드를 추가할 수 없는 경우) 가장 올바른 방법은 사용자를 위한 새 경로를 만들고 정보를 저장하는 것이라는 데 전적으로 동의하지만, 이 확인을 위해 로그인한 후 추가 요청을 하고 싶지 않았습니다(Firestore를 사용하고 있으며 = money를 요청합니다).
사용자 이름을 입력하라는 메시지를 표시하기 위해 이 첫 번째 로그인 검사를 수행해야 했습니다(표시 이름은 Facebook/Google에서 가져온 것이며 첫 번째 로그인일 경우 재정의하는 옵션을 제공하고 싶었기 때문입니다).제가 하게 된 것은 사진 URL 속성을 플래그로 사용하여 처음인지 아닌지를 판단하는 것이었습니다.이 방법은 이상적이지 않지만 요청 비용을 절약하려는 사용자가 이 방법을 해결 방법으로 사용할 수 있습니다.Firebase에서는 그렇게 큰 문제가 아니지만 Firestore에서는 계획에 더 많은 비용이 듭니다.
Firebase UI에서 Java:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Intent i;
if (requestCode == RC_SIGN_IN) {
IdpResponse response = IdpResponse.fromResultIntent(data);
if (resultCode == RESULT_OK) {
if(response.isNewUser()){
Log.d(TAG, "onActivityResult: isNewUser "+response.isNewUser());
} else {
// Successfully signed in
}
// ...
} else {
// handle error
}
}
}
파이어베이스 V9(모듈형)
여기 제게 효과가 있었던 기능이 있습니다.
function isNewUser(auth) {
let newUser;
const metadata = auth.currentUser.metadata;
if (metadata.creationTime == metadata.lastSignInTime) {
newUser = true;
} else {
newUser = false;
}
return newUser;
}
더 짧은 방법을 사용할 수 있습니다.
function isNewUser(auth) {
const metadata = auth.currentUser.metadata;
return metadata.creationTime == metadata.lastSignInTime ? true : false;
}
나는 메타데이터에서 기능을 사용하는 비슷한 것을 본 적이 있습니다.metadata.getCreationTimeStamp()
하지만 그것은 저에게 효과가 없었습니다.
도움이 되길 바랍니다!
이를 통해 다음과 같은 작업을 수행할 수 있습니다.
사용자가 이미 생성된 경우 Firebase를 확인하기 위해 코드 위치를 수정하시겠습니까?
우선 확인 - 현재 사용자 ID가 문서 ID와 일치하면 이전 사용자이고 그렇지 않으면 새 사용자입니다.
예
private boolean isUserMatch(String currentUserId) {
firestore.collection(COLLECTION_USER).get().addOnCompleteListener(new OnCompleteListener< QuerySnapshot >() {
@Override
public void onComplete(@NonNull @NotNull Task< QuerySnapshot > task) {
if (task.isSuccessful()) {
for (QueryDocumentSnapshot documentSnapshot : task.getResult()) {
if (currentUserId.equals(documentSnapshot.getId())) {
return;
}
}
}
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull @NotNull Exception e) {
Log.e(TAG, "onFailure: ", e.getCause());
}
});
return false;
}
언급URL : https://stackoverflow.com/questions/39550149/check-if-user-is-authenticated-for-the-first-time-in-firebase-google-authenticat
'programing' 카테고리의 다른 글
세 개의 열 데이터 프레임을 행렬("긴"에서 "넓은" 형식)로 재구성 (0) | 2023.06.05 |
---|---|
data.frame을 와이드 형식에서 롱 형식으로 재구성 (0) | 2023.06.05 |
Android 플랫폼의 서비스 대 IntentService (0) | 2023.06.05 |
R이 지수 표기법(예: e+10)을 사용하지 않도록 강제합니까? (0) | 2023.06.05 |
Firebase 쿼리 "IN" 제한을 10으로 설정할 수 있는 해결 방법이 있습니까? (0) | 2023.06.05 |