Firebase and Facebook Authentication - swift

I am trying to use Firebase and Facebook login and it is working, but when the Facebook page opens and you close it without logging in it throws an error and says "fatal error: unexpectedly found nil while unwrapping an Optional value"
The line that is highlighted as causing the error is let credential....
Here is my code:
// Login button is pressed
func loginButton(loginButton: FBSDKLoginButton!, didCompleteWithResult result: FBSDKLoginManagerLoginResult!, error: NSError!) {
if let error = error {
print(error.localizedDescription)
} else {
let credential = FIRFacebookAuthProvider.credentialWithAccessToken(FBSDKAccessToken.currentAccessToken().tokenString)
FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
if let error = error {
print(error.localizedDescription)
} else {
self.performSegueWithIdentifier("loginSegue", sender: self)
print("Login complete")
}
}
}
}
Can someone please help me? Thanks

You need to check also if you have a user, or probably the user canceled the sign up
if let user = user {
} else {
print("Uh oh. The user cancelled the Facebook login."))
}

Related

Swift Facebook Login sdk error with code 2

I am getting an error while logging in with Facebook. And it was working about 3-4 months ago.
Now I am back at developing this app again and I changed the development target to iOS 13.0 from iOS 12.0 and add the SceneDelegate and other necessary things. Actually, I don't think this is the reason but good to mention.
Now I am getting this error:
FBSDKLog: Cannot login without a valid login configuration. Please
make sure the LoginConfiguration provided is non-nil Error
Domain=com.facebook.sdk.core Code=2 "(null)"
UserInfo={com.facebook.sdk:FBSDKErrorDeveloperMessageKey=Cannot login
without a valid login configuration. Please make sure the
LoginConfiguration provided is non-nil}
while running this:
fbLoginManager.logIn(permissions: ["email, public_profile"], from: self) { (loginResult, error) in
if error != nil {
print(error!)
}
if let currentToken = AccessToken.current {
let credential = FacebookAuthProvider.credential(withAccessToken: currentToken.tokenString)
Auth.auth().signIn(with: credential) { (authResult, error) in
if let error = error {
let authError = error as NSError
print(authError)
} else {
DispatchQueue.main.async {
self.setupTabbar()
self.dismiss(animated: true, completion: nil)
}
}
}
}
}
I checked info.plist several times and apply the instructions from scratch but I am still getting this error.
I am using XCode 12.5 and Swift 5
Edit: When I remove the permissions it works but I actually need those permissions.
Solution
I changed permissions from ["email, public_profile"] to:
["email", "public_profile"]
so it looks like this:
fbLoginManager.logIn(permissions: ["email", "public_profile"], from: self) { (loginResult, error) in
if error != nil {
print(error!)
}
if let currentToken = AccessToken.current {
let credential = FacebookAuthProvider.credential(withAccessToken: currentToken.tokenString)
Auth.auth().signIn(with: credential) { (authResult, error) in
if let error = error as NSError? {
print(error)
} else {
DispatchQueue.main.async {
self.setupTabbar()
self.dismiss(animated: true, completion: nil)
}
}
}
}
}

(Firebase) After login with facebook, it won't return to my app

When I log in with Facebook in on a Real Device It will be stuck on the Facebook login page and don' return back to my app.
I have put facebook code in URL Schemes and put all code that need to put in info.plist.
This is all the code that i use to login Facebook by using firebase.
In Viewdidload
facebookButton.addTarget(self, action: #selector(handleCustomFBLogin), for: .touchUpInside)
Code that i use in Viewcontroller.
#objc func handleCustomFBLogin(sender:UIButton!){
LoginManager().logIn(permissions: ["email", "public_profile"], from: self) { (result, error) in
guard let result = result else {
print("No result found")
return
}
if result.isCancelled {
print("Facebook Login Cancelled")
} else if let error = error {
print("Process error \(error.localizedDescription)")
} else {
print("Logged in")
self.showEmailAddress()
self.actionfb()
}
}
}
func loginButton(_ loginButton: FBLoginButton, didCompleteWith result: LoginManagerLoginResult?, error: Error?){
if(error != nil){
print(error!)
return
}else{
print("Successfully Logged in using facebook")
showEmailAddress()
}
}
func actionfb(){
let accessToken = AccessToken.current
guard (accessToken?.tokenString) != nil else {return}
let credential = FacebookAuthProvider.credential(withAccessToken: accessToken!.tokenString)
// Perform login by calling Firebase APIs
Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
if let error = error {
self.showAlert(title: "error", message: "\(error.localizedDescription)")
return
}
self.performSegue(withIdentifier: "GoGo", sender: nil)
self.navigationController?.setNavigationBarHidden(true, animated: true)
}
}
func showEmailAddress(){
GraphRequest(graphPath: "/me", parameters: ["fields" : "id, name, first_name, last_name, email, birthday, picture"]).start { (connection, result, err) in
if(err != nil){
print("Failed to start GraphRequest", err ?? "")
return
}
print(result ?? "")
}
}
func loginButtonDidLogOut(_ loginButton: FBLoginButton){
print("Logged out of Facebook")
}
In Appdelegate
ApplicationDelegate.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
This will happen only when i had test on real device!!, but in simulation this can work normally
I'm not exactly sure if this is the solution, but this fixed it for me.
I copied the OAuth redirect URI from my firebase, under Authentication -> Facebook
And then on my Facebook developer page, under Products -> Facebook Login -> Settings, I pasted it into Valid OAuth Redirect URIs
I then logged in by entering in my username and password into of clicking "Login with Facebook" and the error stopped happening.
I have no idea if the error will return, maybe this will be helpful to someone though.

A (swift) project is crashing when cancel facebook authentication

My project use Firebase and Facebook Authentication. It works fine, but when I choose to cancel the Facebook Authentication (the first time when i fetch the uid) the project crash.
Here is the method i use:
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result: FBSDKLoginManagerLoginResult!, error: Error!) {
let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
Auth.auth().signInAndRetrieveData(with: credential) { (user, error) in
// [START_EXCLUDE]
if let error = error {
print(error.localizedDescription)
return
}
self.uid = Auth.auth().currentUser?.uid
self.firstFetch()
// [END_EXCLUDE]
}
print("logged in")
}
Can Anyone help me, please?
Ok, the whole implementation of this function was wrong, because it was fetching the user no matter if it was authenticated or not. Here is the new method I wrote:
func loginButton(_ loginButton: FBSDKLoginButton!, didCompleteWith result:
FBSDKLoginManagerLoginResult!, error: Error!) {
if error != nil {
print("look a at your.. errm.. code, please", error.localizedDescription)
} else if result.isCancelled {
print("houston, we have a situation: the player cancelled the auth request")
} else {
let credential = FacebookAuthProvider.credential(withAccessToken: FBSDKAccessToken.current().tokenString)
Auth.auth().signInAndRetrieveData(with: credential) { (user, error) in
self.uid = Auth.auth().currentUser?.uid
print("you're in, remember: with great power comes great responsibility!")
self.firstFetch()
}
}
}

SWIFT 3 Parse + FB Login

I would like to make a custom login button with 'ParseFacebookUtilsV4'framework.
regarding the documentation of Parse, it should be:
PFFacebookUtils.logInInBackgroundWithReadPermissions(permissions) {
(user: PFUser?, error: NSError?) -> Void in
if let user = user {
if user.isNew {
print("User signed up and logged in through Facebook!")
} else {
print("User logged in through Facebook!")
}
} else {
print("Uh oh. The user cancelled the Facebook login.")
}
}
The error is:
Use of unresolved identifier 'permissions'
Do you have an idea?
you should add the permissions
let permissions = ["public_profile", "email", "user_friends"]
PFFacebookUtils.logInInBackground(withReadPermissions: permissions) { (user : PFUser?, error: Error?) in

Firebase Facebook login: An invalid API Key was supplied in the request

Trying to get Facebook login to work with the new Firebase, but I keep getting this error: "An invalid API Key was supplied in the request."
facebookLogin.logInWithReadPermissions(["public_profile", "email", "user_friends"], fromViewController: self) { (login, error) in
if error != nil {
print("Facebook login failed. Error \(error)")
} else if login.isCancelled {
print("Facebook login was cancelled.")
} else {
let accessToken = FBSDKAccessToken.currentAccessToken().tokenString
let credential = FIRFacebookAuthProvider.credentialWithAccessToken(accessToken)
if let user = FIRAuth.auth()?.currentUser {
user.linkWithCredential(credential) { (sup, error) in
if let error = error {
print(error.localizedDescription)
return
}
}
} else {
FIRAuth.auth()?.signInWithCredential(credential) { (user, error) in
if let error = error {
// ERROR COMING FROM HERE
print(error.localizedDescription)
return
}
}
}
}
}
Follow the instructions from Google: https://support.google.com/cloud/answer/6158862?hl=en to get or create the API KEY of your iOS App.
Then you need to grab this API KEY and put it in the GoogleService-Info.plist as the:
Key: API_KEY
Value: the api key that you got.