Microsoft - hippogamesunity/SimpleSignIn GitHub Wiki
Welcome to Simple Microsoft Sign-In wiki!
The asset provides Microsoft sign-in with OAuth 2.0 for Android, iOS, Windows, macOS, Universal Windows Platform (UWP) and WebGL apps made with Unity. You can also get access tokens to make REST API calls.
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 Microsoft 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)
Terminology
- Please visit Terminology section
Understanding how it works
-
Generic workflow (for platforms that support deep linking):
- Your app navigates users to Microsoft
Authorization Endpointusing a default web browser (embedded webviews are not allowed) - Users perform sign-in using their login and password
- Microsoft
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 Microsoft
-
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.and small alphanumeric symbols only (no spaces, no undercores). 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: navigate to
Player Settingsand enableResolution and Presentation > Force Single Instanceand setOther Settings > Api Compatibility Level = .NET Framework - For Editor: Set
Allow downloads over HTTP = Always allowed(Unity 2022+)
Setup steps
- Visit Microsoft Entra admin center
- Navigate to
Applications > App registrationsand pressNew registration - Enter your app name, choose
Supported account types = Personal Microsoft accounts onlyand pressRegisterScreenshot(https://github.com/hippogamesunity/SimpleSignIn/blob/main/Screenshots/Microsoft/RegisterApp.png?raw=true) - Navigate to
App registrations, select your app and copyApplication (client) IDfromOverviewScreenshot(https://github.com/hippogamesunity/SimpleSignIn/blob/main/Screenshots/Microsoft/GetClientId.png?raw=true) - Navigate to
Authentication, pressAdd a platforminPlatform configurationsand choseMobile and desktop applicationstype - Add
simple.oauth://oauth2/ms(USE YOUR custom URI scheme from Preconditions, but leave the same pathoauth2/ms) toRedirect URIsand pressConfigure, then addhttp://localhosttoRedirect URIsand pressSave - Press
Add a platforminPlatform configurationsand chooseSingle-page application - Add
https://hippogames.dev/api/oauth/redirecttoRedirect URIs, checkAccess tokensandID tokensand pressConfigure - Ensure you have the same setup as on Screenshot(https://github.com/hippogamesunity/SimpleSignIn/blob/main/Screenshots/Microsoft/RedirectURIs.png?raw=true)
- Return to Unity and configure
Resources/MicrosoftAuthSettings.asset- Set
Client Idfrom step 4 - Set
Client Uri Schemefrom Preconditions - Check
Access Scopes(openid,email,profileare required to get user info,offline_accessis required to get refresh tokens)
- Set
Checklist
-
Custom URI schemeis picked, and it has a different value thansimple.oauth -
Custom URI schemeis set in 3 places: [1] Microsoft Entra admin center (Redirect URIs), [2] Resources/MicrosoftAuthSettings.asset, [3] your application manifest (AndroidManifest.xml for Android,Supported URL schemesfor iOS,Protocolfor UWP) -
Client Idis copied to Resources/MicrosoftAuthSettings.asset
Usage
- Check our
Examplescene and C# code ofExample.cs - Create an instance of
MicrosoftAuth - Call
MicrosoftAuth.SignInorMicrosoftAuth.GetAccessToken - Create
OnSignInorOnGetAccessTokencallbacks - Build and test
- Write a review on the Asset Store :)
Best practices
- Call
MicrosoftAuth.SignInwithcaching: trueto return cachedUserInfo - Call
MicrosoftAuth.SignInwithcaching: falseto requestUserInfofrom Microsoft - Call
MicrosoftAuth.GetAccessTokeninstead ofMicrosoftAuth.SignInif you need an access token only (and don't needUserInfo) - You can use
MicrosoftAuth.SavedAuthto getTokenResponseorUserInfo(don't forget to check all values for null) - Call
MicrosoftAuth.SignOutwhen 'Sign out` button is pressed, optionally you can redirect user to Microsoft website for logout - Disable debug logs for production by setting
MicrosoftAuth.DebugLog = false
Next steps (optional)
- You can add extra access scopes in
Resources/MicrosoftAuthSettings.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 - You can use this asset with
asyncmethods, just refer toMicrosoftAuth.csfor examples
Can I trust 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.- It's recommended to deploy your own trusted
Authorization Middlewareto handle sensitive data. Please refer to Authorization Middleware article.
Notes
- Please refer to User data disclosure
- Don't use default credentials that come with the asset in production, they are for test purposes only and can be disabled/blocked
- Check Manual cancellation if needed
Known issues
- Please visit Common issues section
- To perform complete user sign out, you should redirect users to Microsoft website for logout by calling
MicrosoftAuth.SignOut(logout: true)(after this, users will be able to enter credentinals)