플러터 파이어베이스 구글 로그인이 작동하지 않습니다. 계정 선택 후 중지
나는 현재 내 앱 내에서 구글 로그인과 인증을 구현하려고 노력하고 있다. 파이어베이스에 프로젝트를 설정하고 앱을 만들고 구글-서비스.json을 애플리케이션에 넣고 빌드.gradle에 필요한 플러그인을 추가하고 파이어베이스에 SHA-1 키를 설정했다. 이메일 인증은 잘 작동하지만 구글 인증은 문제를 일으키고 있다.
모든 인증은 내가 만든 '인증' 패키지에서 이루어진다. 인증 페이지가 포함되어 있으며 모든 인증 로직을 수행합니다. 실행 중인 '메인' 플러터 앱은 이 패키지를 사용하기 위해 가져옵니다. 이 '메인' 프로젝트의 build.gradle 파일에는 Google 서비스 플러그인()에 대한 추가 사항이 포함되어 있습니다. '메인' 프로젝트가 실행되면 사용자가 현재 로그인되어 있는지 확인합니다. 그렇지 않으면 '인증' 패키지로 제어를 전달하여 인증 화면을 표시하고 로그인을 처리합니다.
로그인할 구글 계정을 선택한 후 문제가 발생합니다. 계정을 선택하면 계정 선택 대화상자가 닫히고 그 이후에는 아무 일도 일어나지 않습니다. 사용자가 인증되지 않고(Firebase에서 확인됨) 예외가 발생하지 않으며, 모든 것을 둘러싼 트라이캐치는 어떠한 예외도 포착하지 못한다. 기능의 모든 실행이 중단된 것처럼 보입니다. 나는 여전히 앱을 통해 이동할 수 있지만 로그인 방법은 실행이 완료되지 않는다.
아래의 사인인 방법을 확인할 수 있습니다. 라인 실행 후에는 어떤 이유로 인해 계속되지 않습니다.
///
Future<String> _signUpWithGoogle() async {
bool isLoggedIn = await _firebaseAuth.isLoggedIn();
if (!isLoggedIn) {
googleSignIn = GoogleSignIn();
final GoogleSignInAccount googleSignInAccount =
await googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleSignInAuthentication.accessToken,
idToken: googleSignInAuthentication.idToken,
);
final AuthResult authResult =
await _firebaseAuth.signInWithCredential(credential);
final FirebaseUser user = authResult.user;
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _firebaseAuth.getUser();
assert(user.uid == currentUser.uid);
return 'signInWithGoogle succeeded: $user';
} else {
FirebaseUser user = await _firebaseAuth.getUser();
return 'signInWithGoogle succeeded: $user';
}
}
나는 플랫폼이라고 생각한다어떤 일이 잘못되면 예외가 돌아와야 하지만, 처음에는 예외가 돌아오지 않는다. 구글 로그인 방법을 다시 트리거하면 플랫폼을 받습니다예외는 다음과 같습니다:
PlatformException(error, Concurrent operations detected: signIn, signIn, null)
아래에서 '메인' 앱과 '인증' 패키지에 대한 종속성도 확인할 수 있습니다:
'주' 앱 종속성
dependencies:
flutter:
sdk: flutter
cupertino_icons: ^0.1.2
permission:
intl_translation:
flutter_svg:
sqflite:
path:
path_provider:
uuid:
qr_flutter:
vibration:
reflectable:
provider:
launcher_module:
path: ../modules/launcher_module
individual:
path: ../modules/individual
common:
path: ../packages/common
persistence:
path: ../packages/persistence
resources:
path: ../packages/resources
authentication:
path: ../packages/authentication
screen:
flutter_screen_scaler: ^0.0.1
page_indicator:
toast: ^0.1.5
rxbus: ^0.0.2
shared_preferences:
'인증' 패키지 종속성
dependencies:
flutter:
sdk: flutter
firebase_auth: ^0.15.3+1
google_sign_in: ^4.1.1
flutter_facebook_login:
shared_preferences:
common:
path: "../common"
toast: ^0.1.5
또한 모든 인증 로직을 메인 앱으로 이동하고 '인증' 패키지에 대한 참조를 제거했습니다. 하지만, 똑같은 일이 여전히 일어납니다.
내가 이 모든 것에 잘못하고 있거나 놓치고 있는 것이 있는가?
내 이전 의견을 공식적인 답변으로 바꾸기 위해:
초기 주석:
위의 코드에는 이상이 없는 것 같습니다. 나는 작동하는 거의 동일한 코드를 가지고 있고, 같은 버전의 코드를 가지고 있다. 내가 할 일은 플러그인의 네이티브 코드를 디버그하여 플러그인이 어디에 걸리는지 파악하고 왜 그런 일이 일어나는지 이해하는 것이다. 당신이 언급한 것과 플러그인의 코드를 잠깐 본 후, 로그인할 계정을 선택하고 결과를 플러터로 다시 보낼 때 콜백 사이 어딘가에 갇히는 것이 확실하다.
저자가 대답한 후:
작성자는 더 이상 호출하지 않도록 앱의 시작 활동을 사용자 정의했으며, 이로 인해 플러그인이 네이티브 측에서 플러터 측으로 데이터를 다시 보낼 수 없었습니다.
권한을 요청하거나 다른 앱으로 사진을 찍는 등 데이터를 반환하기 위한 장치가 실행될 때마다 동일한 메커니즘이 사용됩니다.
auth.smooth
import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:fluttertoast/fluttertoast.dart';
import 'package:google_sign_in/google_sign_in.dart';
import 'package:shared_preferences/shared_preferences.dart';
abstract class BaseAuth {
Future<String> signInWithGoogle();
//optional if you need to store user data
String name = "User";
String email = "Demo";
String imageUrl = "https://celebritypets.net/wp-content/uploads/2016/12/Adriana-Lima.jpg";
}
enum authProblems { UserNotFound, PasswordNotValid, NetworkError }
class Auth implements BaseAuth {
final FirebaseAuth _firebaseAuth = FirebaseAuth.instance;
final GoogleSignIn googleSignIn = GoogleSignIn();
Future<String> signInWithGoogle() async {
final GoogleSignInAccount googleSignInAccount = await googleSignIn.signIn();
final GoogleSignInAuthentication googleSignInAuthentication =
await googleSignInAccount.authentication;
final AuthCredential credential = GoogleAuthProvider.getCredential(
accessToken: googleSignInAuthentication.accessToken,
idToken: googleSignInAuthentication.idToken,
);
final AuthResult authResult = await _firebaseAuth.signInWithCredential(credential);
final FirebaseUser user = authResult.user;
// Checking if email and name is null
assert(user.email != null);
assert(user.displayName != null);
assert(user.photoUrl != null);
name = user.displayName;
email = user.email;
imageUrl = user.photoUrl;
// Only taking the first part of the name, i.e., First Name
if (name.contains(" ")) {
name = name.substring(0, name.indexOf(" "));
}
assert(!user.isAnonymous);
assert(await user.getIdToken() != null);
final FirebaseUser currentUser = await _firebaseAuth.currentUser();
assert(user.uid == currentUser.uid);
return 'signInWithGoogle succeeded: $user';
}
authprovider.device
import 'package:flutter/material.dart';
import 'package:multitask_flutter/auth.dart';
class AuthProvider extends InheritedWidget {
AuthProvider({Key key,Widget child, this.auth}) : super(key: key,child: child);
final BaseAuth auth;
@override
bool updateShouldNotify(InheritedWidget oldWidget) => true;
static AuthProvider of(BuildContext context) {
return context.dependOnInheritedWidgetOfExactType<AuthProvider>();
}
}
로그인 페이지.로그인
import 'package:appname_flutter/authprovider.dart';
//just call this... when user click on button...
var auth = AuthProvider.of(context).auth;
auth.handleSignIn();
그리고 당신은...
도움이 되길 바랍니다.
내 경우 4개월 전에 파이어베이스에 디버깅 샤1 키를 추가했고, 지금은 몇 가지 변경을 하려고 했지만 로그인할 수 없다.그동안 나는 내 노트북 OS를 바꾸었고, 그래서 나의
또한 안드로이드 스튜디오와 해당 데이터를 제거하고 vscode만 유지하면 이제 디버깅 키를 재생성하고 파이어베이스에 추가해야 합니다.
now the required step is to create new debugging key add it to firebase.
참고: 이것이 많은 경우 주요 원인은 아니지만 한 번 시도해 보십시오
나는 같은 문제가 있었다 - 우리가 같은 튜토리얼에서 작업하는 것처럼 보인다 (나도 이것을 처음이다). 나에게 문제는 파이어베이스의 SHA 인증서 지문이었다. 만약 당신이 그것들을 설정하지 않았다면 로그인은 아무것도 하지 않을 것이다. 터미널 탭에서 로그인이 단순히 자체적으로 취소되는 것을 볼 수 있었습니다.
문제를 해결하기 위해 다음 작업을 수행했습니다:
- 내 키 파일을 설정합니다(키스토어 - 네, 처음에는 이것을 하는 것을 잊었습니다!)
- 내 키스토어 파일을 Android 폴더에 추가했습니다
- Android/app/폴더에 key.properties 파일 생성
- Android/app/build.gradle에서 파일에 대한 종속성을 추가했습니다
- 터미널 창에서 안드로이드/gradlew.bat 실행
- 그런 다음 같은 창에서 "gradew signing Report"를 실행합니다. 그러면 SHA1 및 SHA256 키가 나타납니다
- 파이어베이스 콘솔, 프로젝트, 설정, 일반 및 id 앱으로 들어가 등급이 부여한 SHA 인증서 지문을 입력합니다.
그런 다음 앱을 다시 작성하면 작동할 것입니다.
내 경우 프로젝트 수준의 build.gradle 및 앱 수준에서 종속성을 추가하는 것을 잊어버렸다. 파이어베이스 CLI를 통해 안드로이드 및 iOS 앱을 추가할 때.
프로젝트 수준 build.gradle에서 추가해야 합니다
애플리케이션 레벨의 build.gradle에서
나에게 문제는 파이어베이스에서 구글 로그인 방법을 사용할 수 없다는 것이었다. 나는 내 구글 계정을 선택할 수 있는 팝업을 표시하고 있었고, 나는 내가 막히고 있다는 인쇄 문장을 사용하여 볼 수 있었다:
final googleUser = await GoogleSignIn().signIn();
그리고 내 앱은 내가 내 사용자 이름을 클릭한 후 작동을 멈춘 것처럼 보인다. 파이어베이스에서 구글 로그인을 활성화하자 모든 것이 작동하기 시작했다.
'개발하자' 카테고리의 다른 글
Azure Static Web App - Terraform을 사용한 애플리케이션 설정 (0) | 2023.08.14 |
---|---|
How to split cell in VSCode Jupyter Notebook? (0) | 2023.08.14 |
플러터에서 스마트폰이나 태블릿으로 기기를 확인할 수 있나요? (0) | 2023.08.13 |
둥근 탭 바 인 플러터를 만드는 방법은 무엇인가요? (0) | 2023.08.12 |
쿠버네티스 배포에서 동적/가변 이미지 태그를 사용하는 방법? (0) | 2023.08.11 |