This sample shows how to authenticate using LinkedIn Sign-In on Firebase. In this sample we use OAuth 2.0 based authentication to get LinkedIn user information then create a Firebase Custom Token (using the LinkedIn user ID).
Create and setup the Firebase project:
- Create a Firebase project using the Firebase Developer Console.
- Enable Billing on your Firebase the project by switching to the Blaze plan, this is currently needed to be able to perform HTTP requests to external services from a Cloud Function.
- Copy the Web initialisation snippet from Firebase Console > Overview > Add Firebase to your web app and paste it in
public/index.html
andpublic/popup.html
in lieu of the placeholders (where theTODO(DEVELOPER)
are located).
Create and provide a Service Account's credentials:
- Create a Service Accounts file as described in the Server SDK setup instructions.
- Save the Service Account credential file as
./functions/service-account.json
Create and setup your LinkedIn app:
- Create a LinkedIn app in the LinkedIn Developers website.
- Add the URL
https://<application-id>.firebaseapp.com/popup.html
to the OAuth 2.0 > Authorized Redirect URLs of your LinkedIn app. - Copy the Client ID and Client Secret of your LinkedIn app and use them to set the
linkedin.client_id
andlinkedin.client_secret
Google Cloud environment variables. For this use:
firebase functions:config:set linkedin.client_id="yourClientID" linkedin.client_secret="yourClientSecret"
Make sure the LinkedIn Client Secret is always kept secret. For instance do not save this in your version control system.
Deploy your project:
- Run
firebase use --add
and choose your Firebase project. This will configure the Firebase CLI to use the correct project locally. - Run
firebase deploy
to effectively deploy the sample. The first time the Functions are deployed the process can take several minutes.
Open the sample's website by using firebase open hosting:site
or directly accessing https://<project-id>.firebaseapp.com/
.
Click on the Sign in with LinkedIn button and a popup window will appear that will show the LinkedIn authentication consent screen. Sign In and/or authorize the authentication request.
The website should display your name, email and profile pic from LinkedIn. At this point you are authenticated in Firebase and can use the database/hosting etc...
When clicking the Sign in with LinkedIn button a popup is shown which redirects users to the redirect
Function URL.
The redirect
Function then redirects the user to the LinkedIn OAuth 2.0 consent screen where (the first time only) the user will have to grant approval. Also the state
cookie is set on the client with the value of the state
URL query parameter to check against later on.
After the user has granted approval he is redirected back to the ./popup.html
page along with an OAuth 2.0 Auth Code as a URL parameter. This Auth code is then sent to the token
Function using a JSONP Request. The token
function then:
- Checks that the value of the
state
URL query parameter is the same as the one in thestate
cookie. - Exchanges the auth code for an access token using the LinkedIn app credentials.
- Fetches the user ideneity using a LinkedIn API.
- Mints a Custom Auth token (which is why we need Service Accounts Credentials).
- Returns the Custom Auth Token, email, photo URL, user display name and LinkedIn access token to the
./popup.html
page.
The ./popup.html
receives the Custom Auth Token and other data back from the AJAX request to the token
Function and uses it to update the user's profile, saves the access token to the database, authenticate the user in Firebase and then close the popup.
At this point the main page will detect the sign-in through the Firebase Auth State observer and display the signed-In user information.