OAuth2: Authenticeer gebruikers bij Google

OAuth2 is het industriestandaardprotocol voor autorisatie. Het biedt een mechanisme waarmee gebruikers web- en desktopapplicaties toegang kunnen geven tot privégegevens zonder hun gebruikersnaam, wachtwoord en andere privégegevens te delen.

In deze zelfstudie wordt een extensie gebouwd die toegang krijgt tot de Google-contacten van een gebruiker met behulp van de Google People API en de Chrome Identity API . Omdat extensies niet via HTTPS laden, geen omleidingen kunnen uitvoeren of cookies kunnen instellen, vertrouwen ze op de Chrome Identity API om OAuth2 te gebruiken.

Begin

Begin met het maken van een map en de volgende starterbestanden.

De volledige, voltooide extensie kunt u hier downloaden.

manifest.json

Voeg het manifest toe door een bestand met de naam manifest.json te maken en de volgende code op te nemen. Of download het bestand hier .

{
  "name": "OAuth Tutorial FriendBlock",
  "version": "1.0",
  "description": "Uses OAuth to connect to Google's People API and display contacts photos.",
  "manifest_version": 2,
  "browser_action": {
    "default_title": "FriendBlock, friends face's in a block."
  },
  "background": {
    "scripts": [
      "background.js"
    ],
    "persistent": false
  }
}

achtergrond.js

Voeg het achtergrondscript toe door een bestand met de naam background.js te maken en de volgende code op te nemen. Of download het bestand hier .

chrome.browserAction.onClicked.addListener(function() {
  chrome.tabs.create({url: 'index.html'});
});

index.html

Voeg een HTML-bestand toe met de naam index.html en voeg de volgende code toe. Of download het bestand hier .

<html>
  <head>
    <title>FriendBlock</title>
    <style>
      button {
        padding: 10px;
        background-color: #3C79F8;
        display: inline-block;
      }
    </style>
  </head>
  <body>
    <button>FriendBlock Contacts</button>
    <div id="friendDiv"></div>
  </body>
</html>

Uploaden naar het ontwikkelaarsdashboard

Verpak de extensiemap in een .zip bestand en upload dit naar het Chrome Developer Dashboard zonder het te publiceren:

  1. Klik op het ontwikkelaarsdashboard op Nieuw item toevoegen .
  2. Klik op Bestand kiezen , selecteer de .zip extensiemap en upload deze.
  3. Zonder aanvullende velden in te vullen, selecteert u Concept opslaan en keert u terug naar het dashboard .

Zoek de extensie onder Uw vermeldingen en klik op meer info . Kopieer vanuit de pop-up de openbare sleutel en voeg deze toe aan het manifest in de uitgepakte map onder het veld "key" .

{
  "name": "OAuth Tutorial FaceBlcok",
...
  "key": "ThisKeyIsGoingToBeVeryLong/go8G...AQAB"
}

Vergelijk ID's

Open de pagina Extensiebeheer op chrome://extensions , zorg ervoor dat de ontwikkelaarsmodus is ingeschakeld en upload de onverpakte extensiemap. Vergelijk de extensie-ID op de extensiebeheerpagina met de item-ID in het ontwikkelaarsdashboard. Ze moeten overeenkomen.

De ID van de extensie komt overal overeen

De extensie behoudt dezelfde ID door het veld "key" in het manifest op te nemen. Het behouden van één ID is essentieel voor API-registratie.

Maak een OAuth-client-ID

Navigeer naar de Google API-console en maak een nieuw project. Als u klaar bent, selecteert u Inloggegevens in de zijbalk, klikt u op Inloggegevens maken en kiest u OAuth-client-ID .

Maak inloggegevens voor extensie aan

Op de pagina Client-ID maken selecteert u Chrome-app . Vul de naam van de extensie in en plaats de extensie-ID aan het einde van de URL in het veld Applicatie-ID.

Vul de extensie-informatie in

Sluit af door op Maken te klikken. De console levert een OAuth-client-ID.

Registreer OAuth in manifest

Neem het veld "oauth2" op in het extensiemanifest. Plaats de gegenereerde OAuth-client-ID onder "client_id" . Neem voorlopig een lege tekenreeks op in "scopes" .

{
  "name": "OAuth Tutorial FriendBlock",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes":[""]
  },
  ...
}

Start de eerste OAuth-stroom

Registreer de identity in het manifest.

{
  "name": "OAuth Tutorial FaceBlcok",
  ...
  "permissions": [
    "identity"
  ],
  ...
}

Maak een bestand met de naam oauth.js om de OAuth-stroom te beheren en neem de volgende code op. Of download hem hier .

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      console.log(token);
    });
  });
};

Plaats een scripttag voor oauth.js in de kop van index.html .

...
  <head>
    <title>FriendBlock</title>
    ...
    <script type="text/javascript" src="oauth.js"></script>
  </head>
...

Laad de extensie opnieuw en klik op het browserpictogram om index.html te openen. Open de console en klik op de knop "FriendBlock Contacts". Er verschijnt een OAuth-token in de console.

Bekijk het token in de console

Schakel de Google People API in

Keer terug naar de Google API-console en selecteer Bibliotheek in de zijbalk. Zoek naar "Google People API", klik op het juiste resultaat en schakel deze in.

Schakel de People-API in

Voeg de Google People API- clientbibliotheek toe aan "scopes" in het extensiemanifest.

{
  "name": "OAuth Tutorial FaceBlcok",
  ...
  "oauth2": {
    "client_id": "yourExtensionOAuthClientIDWillGoHere.apps.googleusercontent.com",
    "scopes": [
      "https://www.googleapis.com/auth/contacts.readonly"
    ]
  },
  ...
}

Keer terug naar de Google API-console en navigeer terug naar de inloggegevens. Klik op 'Inloggegevens aanmaken' en selecteer 'API-sleutel' in de vervolgkeuzelijst.

Maak People API-referenties aan

Bewaar de gegenereerde API-sleutel voor later gebruik.

Maak het eerste API-verzoek

Nu de extensie over de juiste machtigingen en inloggegevens beschikt en een Google-gebruiker kan autoriseren, kan deze gegevens opvragen via de People API. Update de code in oauth.js zodat deze overeenkomt met de onderstaande code.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=API_KEY',
          init)
          .then((response) => response.json())
          .then(function(data) {
            console.log(data)
          });
    });
  });
};

Vervang API_KEY door de API-sleutel die is gegenereerd via de Google API-console. De extensie moet een JSON-object registreren dat een array van people/account_id 's bevat onder het veld memberResourceNames .

Gezichten blokkeren

Nu de extensie een lijst met de contacten van de gebruiker retourneert, kan deze aanvullende verzoeken indienen om de profielen en informatie van die contacten op te halen . De extensie gebruikt de memberResourceNames om de foto-informatie van gebruikerscontacten op te halen. Update oauth.js om de volgende code op te nemen.

window.onload = function() {
  document.querySelector('button').addEventListener('click', function() {
    chrome.identity.getAuthToken({interactive: true}, function(token) {
      let init = {
        method: 'GET',
        async: true,
        headers: {
          Authorization: 'Bearer ' + token,
          'Content-Type': 'application/json'
        },
        'contentType': 'json'
      };
      fetch(
          'https://people.googleapis.com/v1/contactGroups/all?maxMembers=20&key=<API_Key_Here>',
          init)
          .then((response) => response.json())
          .then(function(data) {
            let photoDiv = document.querySelector('#friendDiv');
            let returnedContacts = data.memberResourceNames;
            for (let i = 0; i < returnedContacts.length; i++) {
              fetch(
                  'https://people.googleapis.com/v1/' + returnedContacts[i] +
                      '?personFields=photos&key=API_KEY',
                  init)
                  .then((response) => response.json())
                  .then(function(data) {
                    let profileImg = document.createElement('img');
                    profileImg.src = data.photos[0].url;
                    photoDiv.appendChild(profileImg);
                  });
            };
          });
    });
  });
};

Herlaad en keer terug naar de extensie. Klik op de FriendBlock-knop en ta-da! Geniet van de gezichten van contact in een blok.

Contacteer gezichten in een blok