OAuth ile hesap bağlama (Dialogflow)

OAuth bağlantı türü, sektör standardı iki OAuth 2.0 akışını (örtük ve yetkilendirme kod akışı) destekler.

Dolaylı kod akışında Google, yetkilendirme uç noktanızı kullanıcının tarayıcısında açar. Başarılı bir şekilde oturum açtıktan sonra Google'a uzun ömürlü bir erişim jetonu döndürürsünüz. Bu erişim jetonu artık Asistan'dan Action'ınıza gönderilen her isteğe dahil edilir.

Yetkilendirme kodu akışında iki uç noktaya ihtiyacınız vardır:

  • Oturum açma kullanıcı arayüzünü henüz oturum açmamış kullanıcılara sunmaktan ve istenen erişime kısa süreli bir yetkilendirme kodu biçiminde izin kaydetmekten sorumlu olan yetkilendirme uç noktası.
  • İki tür exchange'den sorumlu olan jeton değişimi uç noktası:
    1. Yetkilendirme kodunu uzun ömürlü yenileme jetonu ve kısa ömürlü erişim jetonu ile değiştirir. Bu değişim, kullanıcı hesap bağlama akışından geçer.
    2. Kısa ömürlü bir erişim jetonu için uzun süreli yenileme jetonunu değiştirir. Bu exchange, Google'ın süresi dolmuş olduğundan yeni bir erişim jetonuna ihtiyacı olduğunda gerçekleşir.

Örtülü akış kullanılarak verilen erişim jetonlarının geçerlilik süresinin hiçbir zaman dolmaması, Google'ın örtülü akışla kullanılması nedeniyle kullanıcının hesabını tekrar bağlamayı zorunlu kıldığı için Google, örtülü akış akışının uygulanmasını önerir. Güvenlik nedeniyle jetonun süresinin dolması gerekiyorsa kimlik doğrulama kodu akışını kullanmanız önerilir.

OAuth hesap bağlamayı uygulayın

Projeyi yapılandırma

Projenizi OAuth hesap bağlamayı kullanacak şekilde yapılandırmak için aşağıdaki adımları uygulayın:

  1. Actions Console'u açın ve kullanmak istediğiniz projeyi seçin.
  2. Geliştirme sekmesini tıklayın ve Hesap bağlama'yı seçin.
  3. Hesap bağlama'nın yanındaki anahtarı etkinleştirin.
  4. Hesap oluşturma bölümünde Hayır, yalnızca web sitemde hesap oluşturulmasına izin vermek istiyorum'u seçin.

  5. Bağlantı türü bölümünde OAuth ve Dolaylı'yı seçin.

  6. Müşteri Bilgileri bölümünde:

    • Google'dan gelen istekleri tanımlamak için Actions to Google'a (İşlemleriniz tarafından Google'a gönderilen) bir değer atayın.
    • Yetkilendirme ve Jeton Değişimi uç noktalarınızın URL'lerini ekleyin.
  1. Kaydet'i tıklayın.

OAuth sunucunuzu uygulama

Hizmetiniz OAuth 2.0 dolaylı akışını desteklemek için HTTPS tarafından kullanılabilen bir yetkilendirme uç noktası sunar. Bu uç nokta, veri erişimi için kullanıcıların kimliğini doğrulamak ve kullanıcılardan izin almaktan sorumludur. Yetkilendirme uç noktası, henüz oturum açmamış olan kullanıcılarınıza bir oturum açma kullanıcı arayüzü sunar ve istenen erişim için izni kaydeder.

İşleminizin, hizmetinizin yetkili API'lerinden birini çağırması gerektiğinde Google, kullanıcılarınızın kendi adlarına bu API'leri çağırmasına izin vermek için bu uç noktayı kullanır.

Google tarafından başlatılan tipik bir OAuth 2.0 dolaylı akış oturumu aşağıdaki akışa sahiptir:

  1. Google, kullanıcının tarayıcısında yetkilendirme uç noktanızı açar. Kullanıcı daha önce oturum açmadıysa oturum açar ve henüz izin vermemişse Google'ın API'nizle verilerine erişmesine izin verir.
  2. Hizmetiniz bir erişim jetonu oluşturur ve kullanıcının tarayıcısını isteğe eklenmiş erişim jetonuyla tekrar Google'a yönlendirerek bu jetonu Google'a gönderir.
  3. Google, hizmetinizin API'lerini çağırır ve erişim jetonunu her isteğe ekler. Hizmetiniz, erişim jetonunun Google'a API'ye erişim yetkisi verdiğini doğrular ve ardından API çağrısını tamamlar.

Yetkilendirme isteklerini işleme

İşleminizin hesap bağlama işlemini OAuth2 dolaylı akışı üzerinden gerçekleştirmesi gerektiğinde Google, aşağıdaki parametreleri içeren bir istekle kullanıcıyı yetkilendirme uç noktanıza gönderir:

Yetkilendirme uç noktası parametreleri
client_id Google'a atadığınız istemci kimliği.
redirect_uri Bu isteğe yanıt gönderdiğiniz URL.
state Yönlendirme URI'sında değiştirilmeden Google'a geri aktarılan defter değeri.
response_type Yanıtta döndürülecek değerin türü. OAuth 2.0 dolaylı akışı için yanıt türü her zaman token şeklindedir.

Örneğin, yetkilendirme uç noktanız https://myservice.example.com/auth adresinde bulunuyorsa istek aşağıdaki gibi görünebilir:

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

Yetkilendirme uç noktanızın oturum açma isteklerini işleyebilmesi için aşağıdaki adımları uygulayın:

  1. İstenmeyen veya yanlış yapılandırılmış istemci uygulamalarına erişim izni verilmesini önlemek için client_id ve redirect_uri değerlerini doğrulayın:

    • client_id öğesinin Google'a atadığınız istemci kimliğiyle eşleştiğini doğrulayın.
    • redirect_uri parametresi tarafından belirtilen URL'nin aşağıdaki biçimde olduğunu onaylayın:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID
      YOUR_PROJECT_ID, Actions Console'un Proje ayarları sayfasında bulunan kimliktir.
  2. Kullanıcının hizmetinizde oturum açıp açmadığını kontrol edin. Kullanıcı oturum açmamışsa hizmetinizin oturum açma veya kayıt akışını tamamlayın.

  3. Google'ın API'nize erişmek için kullanacağı bir erişim jetonu oluşturun. Erişim jetonu herhangi bir dize değeri olabilir ancak kullanıcıyı ve jetonun ait olduğu istemciyi benzersiz şekilde temsil etmeli ve tahmin edilebilir olmamalıdır.

  4. Kullanıcının tarayıcısını redirect_uri parametresiyle belirtilen URL'ye yönlendiren bir HTTP yanıtı gönderin. Aşağıdaki parametrelerin tümünü URL parçasına ekleyin:

    • access_token: az önce oluşturduğunuz erişim jetonu
    • token_type: bearer dizesi
    • state: Orijinal istekteki değiştirilmemiş durum değeri Aşağıda, elde edilen URL örneği verilmiştir:
      https://oauth-redirect.googleusercontent.com/r/YOUR_PROJECT_ID#access_token=ACCESS_TOKEN&token_type=bearer&state=STATE_STRING

Google'ın OAuth 2.0 yönlendirme işleyicisi, erişim jetonunu alır ve state değerinin değişmediğini onaylar. Google, hizmetiniz için bir erişim jetonu aldıktan sonra bu jetonu AppRequest'in parçası olarak sonraki İşleminize yapılan çağrılara ekler.

Kimlik doğrulama akışını başlatma

Kimlik doğrulama akışını başlatmak için Hesapta Oturum Açma yardımcı amacını kullanın. Aşağıdaki kod snippet'lerinde, bu yardımcıyı kullanmak için Dialogflow'da ve Actions SDK'da nasıl yanıt gönderileceği açıklanmaktadır.

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": "{}"
      }
    }
  ]
}

İşlemler SDK'sı:

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\":{}}"
}

Veri erişim isteklerini işleme

Asistan isteği erişim jetonu içeriyorsa öncelikle erişim jetonunun geçerli olduğundan (ve süresinin dolmamış olduğundan) emin olun, ardından veritabanınızdan ilişkili kullanıcı hesabını alın.