it-roy-ru.com

Как выйти из Google после прохождения аутентификации

Так что мое приложение имеет возможность войти в систему с помощью Google. После нажатия кнопки, которую предоставляет Google, открывается веб-представление, в котором пользователь вводит свои учетные данные. После предоставления приложению доступа к его информации приложение затем регистрирует пользователя и изменяет SignInViewController на TabBarController (где они теперь могут взаимодействовать соответствующим образом).

Когда пользователь нажимает кнопку «Выход», он направляется на экран входа в систему, как и следовало ожидать. Но странным является то, что если пользователь снова нажимает кнопку Google, он автоматически входит в систему без дополнительной аутентификации и без возможности удалить свою учетную запись. Являются ли они способом очистки учетных данных Google, чтобы защитить пользователей от случайной кражи?

Войти в функцию:

func signIn(signIn: GIDSignIn!, didSignInForUser user: GIDGoogleUser!, withError error: NSError!) {
    if let error = error {
        print(error.localizedDescription)
        return
    }
    let authentication = user.authentication
    let credential = FIRGoogleAuthProvider.credentialWithIDToken(authentication.idToken, accessToken: authentication.accessToken)
    FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
        // ...
        SignInViewController().signedIn(user)
    }
    // ...
}

Функция выхода:

func signOutOverride() {
    do {
        try! FIRAuth.auth()!.signOut()
        CredentialState.sharedInstance.signedIn = false
        // Set the view to the login screen after signing out
        let storyboard = UIStoryboard(name: "SignIn", bundle: nil)
        let loginVC = storyboard.instantiateViewControllerWithIdentifier("SignInVC") as! SignInViewController
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        appDelegate.window?.rootViewController = loginVC
    } catch let signOutError as NSError {
        print ("Error signing out: \(signOutError)")
    }
}
19
About7Deaths

Свифт

попробуйте GIDSignIn.sharedInstance().signOut() 

цель - с

[[GIDSignIn sharedInstance] signOut];
42
Rahul Patel

Да, как @Rahul сказал, что следующий код будет правильным способом сделать это.

GIDSignIn.sharedInstance().signOut()

https://developers.google.com/identity/sign-in/ios/sign-in?ver=Swift#sign_out_the_user

10
Lazy

Хотелось немного подробнее остановиться на предыдущих ответах после игры с GoogleSignIn SDK.

Я видел методы signOut() и disconnect() и задавался вопросом, в чем заключаются различия.

signOut() - это синхронный вызов:

// Immediately sets GIDSignIn.sharedInstance()?.currentUser to nil. 
// For example, if the user is already signed in:

print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - signed in
GIDSignIn.sharedInstance()?.signOut()
print(GIDSignIn.sharedInstance()?.currentUser != nil) // false - signed out

disconnect() позволяет пользователю аннулировать доступ к приложению в дополнение к для выхода из системы. Я предполагаю, что это означает, что они должны будут повторно предоставить любые разрешения вашему приложению, если они решат войти снова. 

Согласно Документам Google для разработчиков если пользователь выберет отключить от вашего приложения, вам потребуется удалить любые данные Google пользователя, которые были сохранены в вашем приложении.

Кроме того, disconnect() является асинхронным. Результат вызова разъединения будет возвращен методу GIDSignInDelegate.sign(_:didDisconnectWith:withError:).

// Also sets GIDSignIn.sharedInstance()?.currentUser to nil. 
// Asynchronous call. If for example the user was already signed in:

print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - signed in
GIDSignIn.sharedInstance()?.disconnect()
print(GIDSignIn.sharedInstance()?.currentUser != nil) // true - still signed in

// MARK: - GIDSignInDelegate
func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
    print(GIDSignIn.sharedInstance()?.currentUser != nil) // false - signed out

    // Remove any data saved to your app obtained from Google's APIs for this user.
}
0
orangemako