我正在使用Parse Server来托管我的应用程序,目前使用用户名和密码以及Facebook进行身份验证。我也想使用谷歌。似乎没有关于如何执行此操作的指南,因此任何帮助将不胜感激。
我熟悉使用适用于iOS的Google SignIn SDK,但只是没有将其与Parse集成。
谢谢。
在服务器上启用 oauth(将在以后的更新中弃用并更改为身份验证)
oauth: {
google: true
},
在客户端创建身份验证委托
class AuthDelegate : NSObject, PFUserAuthenticationDelegate {
func restoreAuthentication(withAuthData authData: [String : String]?) -> Bool {
return true
}
}
使用 Google SDK 登录并获取用户 ID 和访问令牌
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!)"]
通过身份验证登录
解析PFUser.logInWithAuthType(inBackground: "google", authData: authd)
请注意,您已经考虑过自己更新访问令牌(客户端或服务器端)
这是我使用 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)
}
}