如何在iOS上的Parse Server上实施Google登录?

时间:2016-05-19 23:15:42

标签: ios parse-platform google-signin parse-server

我正在使用Parse Server托管我的应用程序,目前使用用户名和密码以及Facebook进行身份验证。我也想用谷歌。似乎没有关于如何做到这一点的指南,所以任何帮助将不胜感激。

我熟悉使用适用于iOS的Google SignIn SDK,但却没有将其与Parse集成。

感谢。

2 个答案:

答案 0 :(得分:0)

在服务器上启用oauth(将在未来更新中弃用并更改为auth)

oauth: {
  google: true
},

在客户端创建AuthDelegate

class AuthDelegate : NSObject, PFUserAuthenticationDelegate {
    func restoreAuthentication(withAuthData authData: [String : String]?) -> Bool {
        return true
    }
}

使用Google SDK登录并获取UserID和AccessToken

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
   print(user.userID)
   print(user.authentication.accessToken)
   print(user.authentication.accessTokenExpirationDate)
}

设置身份验证数据

let authd : [String: String] = ["id":"\(user.userID!)","expiration_date":"\(user.authentication.accessTokenExpirationDate!)","access_token":"\(gToken!)"]

通过身份验证登录Parse

PFUser.logInWithAuthType(inBackground: "google", authData: authd)

请注意,您已考虑更新自己(客户端或服务器端)的访问权限

答案 1 :(得分:0)

以下是我使用Parse Server实施Google登录的版本。

import UIKit
import Parse
import KVNProgress
import GoogleSignIn

class GoogleAuthWorker: NSObject {
    /// http://nsdateformatter.com
    lazy var dateFormatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
        return formatter
    }()

    var googleSignIn = GIDSignIn.sharedInstance()
    var completion: (Error?) -> Void = { }
    weak var host: UIViewController?

    /// Logs in with Google. Presents Safari view controller from the host view controller.
    func logInWithGoogle(host: UIViewController?, completion: @escaping (Error?) -> Void) {
        self.completion = completion
        self.host = host
        PFUser.register(self, forAuthType: "google")
        googleSignIn?.delegate = self
        googleSignIn?.uiDelegate = self
        googleSignIn?.signIn()
    }
}

// MARK: - PFUserAuthenticationDelegate
extension GoogleAuthWorker: PFUserAuthenticationDelegate {
    func restoreAuthentication(withAuthData authData: [String : String]?) -> Bool {
        // Check whether expiration date is in future or not.
        guard let expirationDateString = authData?["expiration_date"],
            let expirationDate = dateFormatter.date(from: expirationDateString) else { return false }
        return expirationDate > Date()
    }
}

// MARK: - GIDSignInDelegate
extension GoogleAuthWorker: GIDSignInDelegate {
    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error!) {
        guard let user = user else {
            let appError = AppError.googleError(underlyingError: error)
            self.completion(.failure(error: appError))
            return
        }
        let authData: [String: String] = ["id": user.userID,
                                          "id_token": user.authentication.idToken,
                                          "expiration_date": "\(user.authentication.accessTokenExpirationDate!)",
                                          "access_token": user.authentication.accessToken]
        // Ask PFUser to log in with given auth data.
        PFUser.logInWithAuthType(inBackground: "google", authData: authData).continue({ (task) -> Any? in
            if let userObject = task.result {
                // Fill userObject (which is PFUser) by profile data, like:
                //userObject.email = user.profile.email
                //userObject.password = UUID().uuidString
                //userObject["firstName"] = user.profile.givenName
                //userObject["lastName"] = user.profile.familyName
                self.completion(nil)
            } else {
                // Failed to log in.
                self.completion(task.error)
            }
            return nil
        })
    }
}

// MARK: - GIDSignInUIDelegate
extension GoogleAuthWorker: GIDSignInUIDelegate {
    func sign(inWillDispatch signIn: GIDSignIn!, error: Error!) {
    }

    func sign(_ signIn: GIDSignIn!, present viewController: UIViewController!) {
        host?.present(viewController, animated: true, completion: nil)
    }

    func sign(_ signIn: GIDSignIn!, dismiss viewController: UIViewController!) {
        host?.dismiss(animated: true, completion: nil)
    }
}