Java 通过谷歌登录自动登录,无需SharedReference
我已尝试将静默登录作为 我试图通过regex限制其他域登录,我不知道是否还有其他方法,我在Firebase登录中看到了“hd”参数,但实现失败 编辑1:修复代码,现在静默登录不起作用。代码是冗余的,GoogleAppClient也被弃用 我已经看到了使用SharedReferences保存登录令牌的答案,但保存令牌安全吗 我一直在跟踪调查 MainActivity.javaJava 通过谷歌登录自动登录,无需SharedReference,java,android,firebase,google-signin,Java,Android,Firebase,Google Signin,我已尝试将静默登录作为 我试图通过regex限制其他域登录,我不知道是否还有其他方法,我在Firebase登录中看到了“hd”参数,但实现失败 编辑1:修复代码,现在静默登录不起作用。代码是冗余的,GoogleAppClient也被弃用 我已经看到了使用SharedReferences保存登录令牌的答案,但保存令牌安全吗 我一直在跟踪调查 MainActivity.java mAuth = FirebaseAuth.getInstance(); if(mAuth
mAuth = FirebaseAuth.getInstance();
if(mAuth.getCurrentUser() != null) {
silentLogin();
}
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestIdToken(getString(R.string.default_web_client_id))
.requestEmail()
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, this)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
//Show sign-in and sign-out buttons
public void silentLogin() {
OptionalPendingResult<GoogleSignInResult> pendingResult =
Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
if (pendingResult != null) {
handleGooglePendingResult(pendingResult);
} else {
signIn();
}
}
private void handleGooglePendingResult(OptionalPendingResult<GoogleSignInResult> pendingResult) {
if (pendingResult.isDone()) {
GoogleSignInResult signInResult = pendingResult.get();
onSilentSignInCompleted(signInResult);
} else {
pendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {
@Override
public void onResult(@NonNull GoogleSignInResult signInResult) {
onSilentSignInCompleted(signInResult);
}
});
}
}
private void onSilentSignInCompleted(GoogleSignInResult signInResult) {
GoogleSignInAccount signInAccount = signInResult.getSignInAccount();
if (signInAccount != null) {
//Show sign out button
}
else {
signIn();
}
}
private void signIn(){
Intent signInIntent = mGoogleSignInClient.getSignInIntent();
startActivityForResult(signInIntent, RC_SIGN_IN);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == RC_SIGN_IN){
Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data);
handleSignInResult(task);
}
}
private void handleSignInResult(Task<GoogleSignInAccount> completedTask){
try{
GoogleSignInAccount acc = completedTask.getResult(ApiException.class);
FirebaseGoogleAuth(acc);
}
catch (ApiException e){
//Show error
FirebaseGoogleAuth(null);
}
}
private void FirebaseGoogleAuth(GoogleSignInAccount acct) {
if (acct != null) {
AuthCredential authCredential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
mAuth.signInWithCredential(authCredential).addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
updateUI(null);
}
}
});
}
else{
// Auth failed
}
}
private void updateUI(FirebaseUser fUser){
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(getApplicationContext());
if(account != null){
String personName = account.getDisplayName();
String personEmail = account.getEmail();
if (personEmail != null) {
if(personEmail.endsWith("gmail.com"))
{
//Show details
}
else
{
mGoogleSignInClient.signOut();
Toast.makeText(MainActivity.this,"Login with gmail account only",Toast.LENGTH_SHORT).show();
//Show sign in button again
}
}
}
}
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
//Connection failed
}
}
mAuth=FirebaseAuth.getInstance();
if(mAuth.getCurrentUser()!=null){
silentLogin();
}
GoogleSignenOptions gso=新建GoogleSignenOptions.Builder(GoogleSignenOptions.DEFAULT\u登录)
.requestIdToken(getString(R.string.default\u web\u client\u id))
.requestEmail()
.build();
mGoogleSignInClient=GoogleSignIn.getClient(this,gso);
mgoogleapclient=新的Googleapclient.Builder(此)
.enableAutoManage(这个,这个)
.addApi(Auth.GOOGLE\u SIGN\u IN\u API,gso)
.build();
//显示登录和注销按钮
public void silentLogin(){
可选Pendingreult Pendingreult=
谷歌签名授权(mGoogleApiClient);
如果(Pendingreult!=null){
手提袋吊挂(吊挂);
}否则{
签名();
}
}
私用作废手册Pendingreult(可选Pendingreult Pendingreult){
if(pendingreult.isDone()){
GoogleSignInResult signInResult=pendingreult.get();
onSilentSignInCompleted(signInResult);
}否则{
Pendingreult.setResultCallback(新的ResultCallback(){
@凌驾
public void onResult(@NonNull GoogleSignInResult signInResult){
onSilentSignInCompleted(signInResult);
}
});
}
}
silentsignincompleted上的私有无效(GoogleSignInResult signInResult){
GoogleSignInAccount signInAccount=signInResult.getSignInAccount();
if(signInAccount!=null){
//显示注销按钮
}
否则{
签名();
}
}
私人无效签名(){
Intent-signinint=mGoogleSignInClient.getsigninint();
startActivityForResult(签名、注册);
}
@凌驾
受保护的void onActivityResult(int-requestCode、int-resultCode、@Nullable-Intent-data){
super.onActivityResult(请求代码、结果代码、数据);
if(requestCode==RC\u登录){
Task Task=GoogleSignIn.GetSignedAccountFromIntent(数据);
handleSignInResult(任务);
}
}
私有void handleSignInResult(任务完成任务){
试一试{
GoogleSignInAccount acc=completedTask.getResult(ApiException.class);
FirebaseGoogleAuth(acc);
}
捕获(APIE){
//显示错误
FirebaseGoogleAuth(空);
}
}
私有void FirebaseGoogleAuth(谷歌签名帐户){
如果(帐户!=null){
AuthCredential AuthCredential=GoogleAuthProvider.getCredential(acct.getIdToken(),null);
mAuth.signInWithCredential(authCredential).addOnCompleteListener(这是新的OnCompleteListener()){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
FirebaseUser=mAuth.getCurrentUser();
updateUI(用户);
}否则{
updateUI(null);
}
}
});
}
否则{
//身份验证失败
}
}
私有void updateUI(FirebaseUser fUser){
GoogleSignInAccount account=GoogleSignIn.GetLastSignedAccount(getApplicationContext());
如果(帐户!=null){
字符串personName=account.getDisplayName();
字符串personEmail=account.getEmail();
if(personEmail!=null){
如果(personEmail.endsWith(“gmail.com”))
{
//显示细节
}
其他的
{
mGoogleSignInClient.signOut();
Toast.makeText(MainActivity.this,“仅使用gmail帐户登录”,Toast.LENGTH_SHORT.show();
//再次显示登录按钮
}
}
}
}
@凌驾
public void onconnection失败(@NonNull ConnectionResult ConnectionResult){
//连接失败
}
}
您的mAuth为空,因为它是在您使用它进行处理之后定义的
mAuth=FirebaseAuth.getInstance()代码>行应在该条件之前
按以下步骤操作:
mAuth = FirebaseAuth.getInstance();
if(mAuth.getCurrentUser() != null) {
silentLogin();
}
这肯定会奏效的
编辑:
我在项目中所做的工作:
final GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(MyActivity.this);
if (account != null) {
gotoNextActivity();
} else {
signInButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
signIn();
}
});
}
在看了前面的答案并阅读了一些文档之后,我得出了结论,因为我以以下方式实现了上述内容:
GoogleSignInOptions googleSignInOptions = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(getString(R.string.default_web_client_id))
.build();
mGoogleSignInClient = GoogleSignIn.getClient(this, googleSignInOptions);
GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this);
updateUI(mAuth.getCurrentUser());
}
private void updateUI(FirebaseUser firebaseUser) {
if (firebaseUser != null) {
if(Objects.requireNonNull(firebaseUser.getEmail()).endsWith("gmail.com"))
{
//Display details of user
}
else
{
//Sign out
mGoogleSignInClient.revokeAccess();
updateUI(mAuth.getCurrentUser());
Toast.makeText(this, "Login with gmail address only!", Toast.LENGTH_SHORT).show();
}
}else{
// Show sign in button
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if(requestCode == SIGN_IN_REQUEST_CODE){
Task<GoogleSignInAccount> accountTask = GoogleSignIn.getSignedInAccountFromIntent(data);
handleGoogleSignIn(accountTask);
}
}
private void handleGoogleSignIn(Task<GoogleSignInAccount> accountTask) {
try {
GoogleSignInAccount account = accountTask.getResult(ApiException.class);
if (account != null) {
firebaseAuthWithGoogle(account);
}
}
}
private void firebaseAuthWithGoogle(GoogleSignInAccount account) {
AuthCredential credential = GoogleAuthProvider.getCredential(account.getIdToken(), null);
mAuth.signInWithCredential(credential)
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
FirebaseUser user = mAuth.getCurrentUser();
updateUI(user);
} else {
// Show error
}
});
}
}
GoogleSignInOptions GoogleSignInOptions=新建GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT\u登录)
.requestEmail()
.requestIdToken(getString(R.string.default\u web\u client\u id))
.build();
mGoogleSignInClient=GoogleSignIn.getClient(这是googleSignInOptions);
GoogleSignInAccount账户=GoogleSignIn.GetLastSignedAccount(此账户);
updateUI(mAuth.getCurrentUser());
}
私有void updateUI(FirebaseUser FirebaseUser){
if(firebaseUser!=null){
if(Objects.requirennoull(firebaseUser.getEmail()).endsWith(“gmail.com”))
{
//显示用户的详细信息