Minimalistic Google Sign In oAuth 2.0 client written in Swift
GoogleSignIn-Swift is compatible with Swift Package Manager. You can add it as a dependency to your Xcode project by following official documentation.
-
You will need to configure Google oAuth 2.0 client
- Go to Google API Console
- Create new project or choose existing one
- On "Credentials" page, choose "Create credentials ➔ oAuth Client ID"
- Choose "Other" as a Application Type
-
In your project create
GoogleSignIn.Controllerinstanceimport GoogleSignIn let controller = GoogleSignIn.Controller( config: GoogleSignIn.Config( clientId: "CLIENT_ID", clientSecret: "CLIENT_SECRET", redirectUri: "REDIRECT_URI" ), session: URLSession.shared )
You can obtain
CLIENT_IDandCLIENT_SECRETfrom Google API Console.REDIRECT_URIis yourCLIENT_IDwith reverse domain notation and://suffix. For example:- client id:
1234-abcd.apps.googleusercontent.com - reversed client id:
com.googleusercontent.apps.1234-abcd - redirect uri:
com.googleusercontent.apps.1234-abcd://
- client id:
-
Implement presenting sign in page to the user, by opening
signInPageURLprovided by the controller.It can vary depending on the type of the app you are working on. The simpliest way to do it in iOS app is by using
UIApplication.open(_ url:):UIApplication.shared.open(controller.signInPageURL)
-
Configure your application, so it can handle redirect after sign in.
For iOS app, you can do it by adding or modifying
CFBundleURLTypesinInfo.plist:<key>CFBundleURLTypes</key> <array> <dict> <key>CFBundleTypeRole</key> <string>Editor</string> <key>CFBundleURLName</key> <string></string> <key>CFBundleURLSchemes</key> <array> <string>REDIRECT_URI_SCHEME</string> </array> </dict> </array>Replace
REDIRECT_URI_SCHEMEwith yourCLIENT_IDusing reverse domain notation. For example:com.googleusercontent.apps.1234-abcd. -
Handle redirection after user signs in to obtain oAuth tokens (access, ID and refresh) by calling
getTokenResponsefunction onGoogleSignIn.Controller.For iOS app, you can do it by implementing this function in your
UIApplicationDelegate:func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey : Any] = [:]) -> Bool { controller.getTokenResponse(using: url) { result in if case let .success(response) = result { print("ACCESS TOKEN: \(response.accessToken)") } } return true }
If you are using
UIWindowSceneDelegatein your app, implement this function instead:func scene(_ scene: UIScene, openURLContexts contexts: Set<UIOpenURLContext>) { guard let redirectUrl = contexts.first?.url else { return } controller.getTokenResponse(using: redirectUrl) { result in if case let .success(response) = result { print("ACCESS TOKEN: \(response.accessToken)") } } }
-
Do whatever you want with obtained access token.
Copyright © 2019 Dariusz Rybicki Darrarski
License: GNU GPLv3