Home
Nate River edited this page Oct 16, 2023
·
150 revisions
Clone this wiki locally
Welcome to Simple Google Sign-In wiki!
The asset provides Google sign-in with OAuth 2.0 for Android, iOS, Windows, macOS, Universal Windows Platform (UWP) and WebGL apps made with Unity.
Benefits
- Cross-platform user auth for cross-platform games and apps
- No plugins, no 3rd party libs, no dependencies
- No impact to build size
- Get access tokens for integration with other Google services
- More security for client-server apps (get an access token on a client, get all user data on a server to avoid tampering)
- JSON Web Tokens (JWT) validation
- SFSafariViewController is used on iOS (required by App Store review)
- Deep linking for Windows (UNITY_STANDALONE_WIN)
Alternatives
-
Sign-in with Play Gamesfor Android (a part of Google Play Game Services, difficult to setup, super massive with a lot of dependencies, you can't get user email anymore in last versions) -
Sign-in with Applefor iOS (native, but there are issues with getting user emails) - 3rd party SDK for other platforms
Terminology
-
URIis a uniform resource identifier. -
URLis a uniform resource locator. URL is the subset of URI, it identifies the web address or location of a unique resource. -
Custom URI schemeis the first part of a URI before:, it's used to determine an app that should be activated with deep linking. The second part of a URI ispath, it can be used to pass additional parameters to the app. For example,simple.oauth:/oauth2callback/googlehassimple.oauthscheme and/oauth2callback/googlepath. Note thatpathshould begin with a single slash, which is different from regular HTTP URLs. -
Protocolfor Universal Windows Platform is the same thing asCustom URI schemefor Android and iOS. -
OAuthis Open Authorization protocol. - Google
Authorization Endpointis Google OAuth service where users can safely sign in. -
Redirect URIis used by GoogleAuthorization Endpointto safely return data to your app (like auth codes, access tokens). -
OAuth Redirectis a process of passing parameters withRedirect URI, it's considered to be a more secure way to transfer data. -
Authorization Middlewareis my implementation of an intermediary between Google and your app. It's used to workaround WebGL platform limitations.
Understanding how it works
-
Generic workflow (for platforms that support deep linking):
- Your app navigates users to Google
Authorization Endpointusing a default web browser (embedded webviews are not allowed) - Users perform sign-in using their login and password
- Google
Authorization Endpointredirects users toRedirect URI(this can be a deep link when possible) and provides an authorizationcodeto the app (as URI parameters) - The app is activated and obtains
code - The app exchanges
codeforaccess token - The app requests user data with
access token(ID, name, email and other data according access scope defined)
- Your app navigates users to Google
-
For Android, iOS, macOS, Windows and Universal Windows Platform (platforms that support deep linking):
-
Redirect URIis a deep link which activates the app and providescodein URI parameters
-
-
Loopback flow for Editor and Windows (optional):
- This flow is optional for Windows (the generic workflow is used by default)
-
Redirect URIishttp://localhost:PORT/with a random unused port - The app listens to localhost using
System.Net.HttpListener - The app obtains
codeand asks a user to close the browser tab and to return to the app - Further workflow is the same (exchanging
codeforaccess token, requesting user data)
-
Middleware flow for WebGL (the platform doesn't support deep linking and loopback):
-
OAuth RedirecttoAuthorization Middlewareis used to temporary savecode - The app obtains
codefromAuthorization Middlewarewith a POST request - Further workflow is the same (exchanging
codeforaccess token, requesting user data)
-
Preconditions
- For Android, iOS, macOS, Windows and UWP (platforms that support deep linking): COME UP WITH your
Custom URI scheme(orProtocol). It MUST contain the period symbol.. In my example it issimple.oauth, but it can bejelly.bean(note thatCustom URI schemeis not the same as your actual package name or bundle id). - For Android, iOS, UWP: enable deep linking as described in Unity documentation or as described below.
- For Android: create
AndroidManifest.xmlinsideAssets/Plugins/Android/, SET yourCustom URI schemeinside, like<data android:scheme="simple.oauth" />. You can useAndroidManifestExample.xmlfrom the asset as an example, just copy, rename and edit. AGAIN, DON'T FORGET TO REPLACEsimple.oauthwith yourCustom URI scheme! - For iOS and macOS: navigate to
Player Settings > Other > Configurationand add yourCustom URI schemetoSupported URL schemes. In Xcode, make sure that the URL scheme is added (Register your URL scheme). - For Universal Windows Platform: navigate to
Player Settings > Publishing Settingsand setProtocol(it MUST contain a period symbol, for examplesimple.oauth), then enableInternetClientinCapabilities. - For Windows: refer to Settings for Windows section
Setup steps
- Visit https://console.cloud.google.com/apis/credentials
- Create a new app if needed
- Create OAuth client ID
- For Android, iOS, macOS, Windows and UWP: select
iOS(for all 3 platforms, it's not a typo) and fillBundle IDwith your appCustom URI schemeorProtocol(see Preconditions). AGAIN, IT SHOULD BE EXACTLYiOS(this is the most common mistake)!
- For Editor and Windows (optional): select
Desktop app
- For WebGL select
Web applicationand provide "Authorized JavaScript origins" (the URL of your published app) and "Authorized redirect URIs" (SETAuthorization MiddlewareURL:https://hippogames.dev/api/oauth/redirect)
- For Android, iOS, macOS, Windows and UWP: select
- Copy
Client ID- For Windows, WebGL and Editor: copy
Client secretas well
- For Windows, WebGL and Editor: copy
Checklist
-
Custom URI schemeis picked, and it has a different value thansimple.oauth -
Custom URI schemeis set in 3 places: [1] Google Cloud credentials (Bundle ID), [2] Resources/GoogleAuthSettings.asset, [3] your application manifest (AndroidManifest.xml for Android,Supported URL schemesfor iOS,Protocolfor UWP)
Usage
- Check our
Examplescene and C# code ofExample.cs - Configure
Resources/GoogleAuthSettings.asset- For Android, iOS, macOS, Windows and UWP: set
Client IDandCustom URI scheme(orProtocol) - For WebGL, Editor and Windows (optional): set
Client IDandClient secret - Check
Access Scopes(openid,email,profileare required to getUserInfo)
- For Android, iOS, macOS, Windows and UWP: set
- Create an instance of
GoogleAuthand passGoogleAuthSettingsto the constructor - Create a new instance of
GoogleAuthand callGoogleAuth.SignIn - Create
OnSignIncallback as the first argument forGoogleAuth.SignInto obtainUserInfo - Build and test
- Write a review on the Asset Store :)
Best practices
- Call
GoogleAuth.SignInwithcaching: trueto return cachedUserInfo - Call
GoogleAuth.SignInwithcaching: falseto requestUserInfofrom Google - Call
GoogleAuth.GetAccessTokeninstead ofGoogleAuth.SignInif you need an access token only (and don't needUserInfo) - You can use
GoogleAuth.SavedAuthto getTokenResponseorUserInfo(don't forget to check all values for null) - Call
GoogleAuth.SignOutwhen 'Sign out` button is pressed (optional) - Disable debug logs for production by setting
GoogleAuth.DebugLog = false
Next steps (optional)
- You can add extra access scopes in
Resources/GoogleAuthSettings.asset - If you have a backend (server), send
TokenResponseto it (to avoid tapmering user data when sending from clients to your server) - Validate
JSON Web Token (JWT)encoded inTokenResponse.IdTokenon your server (refer toJWTclass for parsing and signature validation example) - For Editor and Windows (optional), you can modify
StandaloneTemplate.html(used by the loopback flow) to edit the message "Success! Please close the browser tab and return to the app." - For Windows, check Settings for Windows
- For WebGL, consider deploying your own
Authorization Middleware
Can I trust to Authorization Middleware? Is it secure to use a 3rd party service?
-
Authorization Middlewarecan't exchangecodeforaccess tokenwithout knowing bothclient secretandcode verifier. Only the app itself can exchangecodeforaccess token. - You can implement your own trusted
Authorization Middleware. Please feel free to request ASP.NET source codes from me. - You can hire me to setup your own trusted
Authorization Middleware.
Notes
- Google OpenID is not the same as Play Games ID (Google Play Game Services), but they both have the same user email
- Don't use default credentials that come with the asset in production, they are for test purposes only and can be disabled/blocked
- You can use the same
iOScredentials for Android, iOS, Windows and UWP
Known issues
- AndroidManifest.xml workaround for Unity 2022
- Some web browsers may block deep links by default. Test on another device or browser if redirecting doesn't happen.
- For security reasons Google allows OAuth in trusted browsers only. Requests from embedded browsers (web views) and emulators may be blocked.
- When using deep linking for Windows,
Force Single Instanceshould be enabled inPlayer Settings. - When using the loopback flow for Editor and Windows (optional), HttpListener is blocking the main thread if
Run In Backgroundis unset. To avoid this, setRun In BackgroundinPlayer Settings. - The App Store review team may reject your app with the reason "poor user experience" if you're using
Sign in with Googleas a primary method. Implement Sign in with Apple a primary method or implement the functionality to create user accounts inside the app.