Łączenie kont za pomocą protokołu OAuth (Dialogflow)

Typ połączenia OAuth obsługuje 2 standardowe przepływy OAuth 2.0: implicit i autoryzacji.

In the implicit code flow, Google opens your authorization endpoint in the user's browser. After successful sign in, you return a long-lived access token to Google. This access token is now included in every request sent from the Assistant to your Action.

In the authorization code flow, you need two endpoints:

  • The authorization endpoint, which is responsible for presenting the sign-in UI to your users that aren't already signed in and recording consent to the requested access in the form of a short-lived authorization code.
  • The token exchange endpoint, which is responsible for two types of exchanges:
    1. Exchanges an authorization code for a long-lived refresh token and a short-lived access token. This exchange happens when the user goes through the account linking flow.
    2. Exchanges a long-lived refresh token for a short-lived access token. This exchange happens when Google needs a new access token because the one it had expired.

Although the implicit code flow is simpler to implement, Google recommends that access tokens issued using the implicit flow never expire, because using token expiration with the implicit flow forces the user to link their account again. If you need token expiration for security reasons, you should strongly consider using the auth code flow instead.

Wdrażanie łączenia kont OAuth

Konfigurowanie projektu

Aby skonfigurować w projekcie połączenie z kontami OAuth, wykonaj te czynności:

  1. Otwórz konsolę Actions i wybierz projekt, którego chcesz użyć.
  2. Kliknij kartę Programowanie i wybierz Łączenie kont.
  3. Włącz przełącznik obok opcji Łączenie kont.
  4. W sekcji Tworzenie konta wybierz Nie, chcę zezwolić na tworzenie konta tylko w mojej witrynie.

  5. W sekcji Typ połączenia wybierz OAuth i Niejednoznaczne.

  6. W sekcji Informacje o kliencie:

    • Przypisz wartość do identyfikatora klienta wystawionego przez Twoje działania dla Google, aby zidentyfikować: pochodzących od Google.
    • Wstaw adresy URL punktów końcowych Authorization i Token Exchange.
.
  1. Kliknij Zapisz.

Wdróż serwer OAuth

Aby obsługiwać niejawny przepływ OAuth 2.0, Twoja usługa wymaga autoryzacji punktu końcowego dostępnego przez HTTPS. Ten punkt końcowy odpowiada za uwierzytelnianie i uzyskiwania od użytkowników zgody na dostęp do danych. Punkt końcowy autoryzacji wyświetla interfejs logowania użytkownikom, którzy nie są jeszcze zalogowani, wyrazić zgodę na żądany dostęp.

Gdy akcja musi wywołać jeden z autoryzowanych interfejsów API usługi, Google używa ten punkt końcowy, aby uzyskać od użytkowników uprawnienia do wywoływania tych interfejsów API w imieniu Google.

Typowa sesja niejawnego przepływu zainicjowana przez Google w języku OAuth 2.0 ma następujący przepływ:

  1. Google otworzy punkt końcowy autoryzacji w przeglądarce użytkownika. loguje się, jeśli jeszcze nie jest zalogowany, i zezwala Google na dostęp swoich danych za pomocą interfejsu API, jeśli nie udzielili jeszcze zgody.
  2. Usługa tworzy token dostępu i zwraca go do Google przez przekierowanie przeglądarki użytkownika z powrotem do Google wraz z tokenem dostępu. do żądania.
  3. Google wywołuje interfejsy API Twojej usługi i łączy token dostępu z każdego żądania. Usługa sprawdza, czy token dostępu przyznaje Google aby uzyskać dostęp do interfejsu API, a następnie wykonać jego wywołanie.

Obsługa żądań autoryzacji

Jeśli akcja musi połączyć konta przez niejawny przepływ OAuth2, Google wysyła użytkownika do punktu końcowego autoryzacji z żądaniem zawierającym ciąg następujące parametry:

Parametry punktu końcowego autoryzacji
client_id Identyfikator klienta przypisany przez Ciebie do Google.
redirect_uri Adres URL, na który została wysłana odpowiedź na to żądanie.
state wartości księgowej, która jest przesyłana do Google bez zmian w identyfikator URI przekierowania.
response_type Typ wartości do zwrócenia w odpowiedzi. W przypadku protokołu OAuth 2.0 implicit przepływu, typ odpowiedzi to zawsze token.

Jeśli na przykład punkt końcowy autoryzacji jest dostępny pod adresem https://myservice.example.com/auth, żądanie może wyglądać tak:

GET https://myservice.example.com/auth?client_id=GOOGLE_CLIENT_ID&redirect_uri=REDIRECT_URI&state=STATE_STRING&response_type=token

Aby punkt końcowy autoryzacji mógł obsługiwać żądania logowania, wykonaj te czynności:

  1. Sprawdź wartości client_id i redirect_uri w zapobiegaj przyznawaniu dostępu do niezamierzonych lub błędnie skonfigurowanych aplikacji klienckich:

    • Sprawdź, czy identyfikator client_id jest zgodny z Twoim identyfikatorem klienta przypisane do Google.
    • Sprawdź, czy URL podany w pliku redirect_uri ma taką postać:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID to identyfikator, który znajdziesz na stronie Ustawienia projektu w Konsoli Actions.
  2. Sprawdź, czy użytkownik jest zalogowany w Twojej usłudze. Jeśli użytkownik nie jest zalogowany dokończ proces logowania lub rejestracji w usłudze.

  3. Wygeneruj token dostępu, którego Google będzie używać, aby uzyskiwać dostęp do Twojego interfejsu API. token dostępu może być dowolną wartością ciągu, ale musi jednoznacznie reprezentować i klienta, dla którego jest przeznaczony token, i nie może być odgadywany.

  4. Wyślij odpowiedź HTTP przekierowującą przeglądarkę użytkownika na ten adres URL wskazywaną przez parametr redirect_uri. Uwzględnij wszystkie następujące parametry we fragmencie adresu URL:

    • access_token: wygenerowany właśnie przez Ciebie token dostępu.
    • token_type: ciąg znaków bearer
    • state: niezmodyfikowana wartość stanu pierwotnego, prośba Oto przykład powstałego adresu URL:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Moduł obsługi przekierowań OAuth 2.0 od Google otrzyma token dostępu i potwierdzi że wartość state się nie zmieniła. Po uzyskaniu przez Google dla Twojej usługi, Google będzie dołączać ten token do kolejnych wywołań do akcji w ramach żądania AppRequest.

Rozpoczynanie procesu uwierzytelniania

Użyj intencji Asystenta logowania się na konto. aby rozpocząć proces uwierzytelniania. Fragmenty kodu poniżej opisują, wysłać odpowiedź w Dialogflow i Action SDK, aby użyć tego pomocnika.

Dialogflow:

Node.js
const {dialogflow, SignIn} = require('actions-on-google');
const app = dialogflow({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('Start Signin', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});
Java
@ForIntent("Start Signin")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
JSON
{
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "simpleResponse": {
              "textToSpeech": "PLACEHOLDER"
            }
          }
        ]
      },
      "userStorage": "{\"data\":{}}",
      "systemIntent": {
        "intent": "actions.intent.SIGN_IN",
        "data": {
          "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
          "optContext": "To get your account details"
        }
      }
    }
  },
  "outputContexts": [
    {
      "name": "/contexts/_actions_on_google",
      "lifespanCount": 99,
      "parameters": {
        "data": "{}"
      }
    }
  ]
}

Pakiet SDK Actions:

Node.js
const {actionssdk, SignIn} = require('actions-on-google');
const app = actionssdk({
  // REPLACE THE PLACEHOLDER WITH THE CLIENT_ID OF YOUR ACTIONS PROJECT
  clientId: CLIENT_ID,
});
// Intent that starts the account linking flow.
app.intent('actions.intent.TEXT', (conv) => {
  conv.ask(new SignIn('To get your account details'));
});
Java
@ForIntent("actions.intent.TEXT")
public ActionResponse text(ActionRequest request) {
  ResponseBuilder rb = getResponseBuilder(request);
  return rb.add(new SignIn().setContext("To get your account details")).build();
}
JSON
{
  "expectUserResponse": true,
  "expectedInputs": [
    {
      "inputPrompt": {
        "richInitialPrompt": {
          "items": [
            {
              "simpleResponse": {
                "textToSpeech": "PLACEHOLDER"
              }
            }
          ]
        }
      },
      "possibleIntents": [
        {
          "intent": "actions.intent.SIGN_IN",
          "inputValueData": {
            "@type": "type.googleapis.com/google.actions.v2.SignInValueSpec",
            "optContext": "To get your account details"
          }
        }
      ]
    }
  ],
  "conversationToken": "{\"data\":{}}",
  "userStorage": "{\"data\":{}}"
}

Obsługa żądań dostępu do danych

Jeśli prośba o Asystenta zawiera token dostępu, najpierw sprawdź, czy token dostępu jest prawidłowy (i nie stracił ważności), a następnie pobierz powiązane konto użytkownika z bazy danych.