OAuth ve Google ile Oturum Açma ile Kolaylaştırılmış Bağlantı

Genel Bakış

OAuth tabanlı Google Oturum Açma Kolaylaştırılmış bağlantı , OAuth bağlantısının üzerine Google ile Oturum Açma özelliğini ekler. Bu, Google kullanıcıları için sorunsuz bir bağlantı deneyimi sağlar ve ayrıca hizmetinize Google dışı bir kimlikle kaydolan kullanıcılar için hesap bağlamayı etkinleştirir.

OAuth ve Google ile Oturum Açma ile hesap bağlama gerçekleştirmek için şu genel adımları izleyin:

  1. İlk olarak, kullanıcıdan Google profiline erişmesine izin vermesini isteyin.
  2. Kullanıcı hesabının mevcut olup olmadığını kontrol etmek için profillerindeki bilgileri kullanın.
  3. Mevcut kullanıcılar için hesapları bağlayın.
  4. Kimlik doğrulama sisteminizde Google kullanıcısı için bir eşleşme bulamazsanız, Google'dan alınan kimlik jetonunu doğrulayın. Daha sonra, kimlik belirtecinde bulunan profil bilgilerine göre bir kullanıcı oluşturabilirsiniz.

Şekil 3 . Kolaylaştırılmış Bağlama ile bir kullanıcının telefonunda Hesap Bağlama

Hesaplar, endüstri standardı OAuth 2.0 örtük ve yetkilendirme kodu akışları kullanılarak birbirine bağlanır. Hizmetinizin OAuth 2.0 uyumlu yetkilendirmeyi ve jeton değişimi uç noktalarını desteklemesi gerekir. Ayrıca, jeton değiş uç nokta desteklemelidir JSON Web Jetonu (JWT) iddialarını ve uygulamak check , create ve get niyet.

Google API İstemci Kimliğinizi ve Sırrınızı alın

OAuth Bağlama adımlarını tamamlarken oluşturduğunuz projeyi kullanarak API İstemci Kimliğinizi ve Sırrınızı almanız gerekecektir. Bunu yapmak için aşağıdaki adımları tamamlayın:

  1. Google API konsolunun Kimlik Bilgileri sayfasını açın.
  2. Bir Google APIs projesi oluşturun veya seçin.

    Projenizde Web uygulaması Türü için bir İstemci Kimliği yoksa, bir tane oluşturmak için Kimlik bilgileri oluştur> OAuth İstemci Kimliği'ni tıklayın. Yetkili JavaScript kaynakları kutusuna sitenizin etki alanını eklediğinizden emin olun. Yerel testler veya geliştirme gerçekleştirdiğinizde, Authorized JavaScript kökenleri alanına hem http://localhost hem de http://localhost:<port_number> eklemeniz gerekir.

OAuth sunucunuzu uygulayın

Mevcut bir kullanıcı hesabını kontrol edin

Kullanıcı, Google profiline erişim izni verdikten sonra, Google, Google kullanıcısının kimliğine ilişkin imzalı bir onay içeren bir istek gönderir. İddia, kullanıcının Google Hesap Kimliğini, adını ve e-posta adresini içeren bilgileri içerir. Projeniz için yapılandırılan belirteç değişimi uç noktası bu isteği işler.

Karşılık gelen Google hesabı kimlik doğrulama sisteminizde zaten varsa, belirteç değişim uç noktanız account_found=true ile yanıt verir. Google hesabı mevcut bir kullanıcıyla eşleşmezse, jeton değişimi uç noktanız account_found=false ile HTTP 404 Bulunamadı hatası verir.

İstek aşağıdaki forma sahiptir:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=check&assertion=JWT&scope=SCOPES

Jeton değişimi uç noktanız aşağıdaki parametreleri işleyebilmelidir:

Jeton uç noktası parametreleri
intent Bu istekler için bu parametrenin değeri check .
grant_type Değiştirilen jetonun türü. Bu istekler için, bu parametre urn:ietf:params:oauth:grant-type:jwt-bearer değerine sahiptir.
assertion Google kullanıcısının kimliğine ilişkin imzalı bir onay sağlayan bir JSON Web Jetonu (JWT). JWT, kullanıcının Google Hesap Kimliğini, adını ve e-posta adresini içeren bilgileri içerir.

Jeton değişim uç noktanız check talebini aldığında, JWT onayını doğrulaması ve kodunu çözmesi gerekir.

JWT onayını doğrulayın ve kodunu çözün

Diliniz için bir JWT kod çözme kitaplığı kullanarak JWT onayını doğrulayabilir ve kodunu çözebilirsiniz. Jetonun imzasını doğrulamak için Google'ın JWK veya PEM biçimlerinde bulunan genel anahtarlarını kullanın.

Kodu çözüldüğünde, JWT iddiası aşağıdaki örnekteki gibi görünür:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Jetonun imzasını doğrulayarak ek olarak, öne sürdü en verenin (doğrulamak iss alanı) olduğu https://accounts.google.com seyirci (yani, aud (alan) atanan istemci kimliğidir ve belirteç geçmediğini onaylayın exp alan).

email , email_verified ve hd alanlarını kullanarak Google'ın bir e-posta adresi barındırıp barındırmadığını ve yetkili olup olmadığını belirleyebilirsiniz. Google'ın yetkili olduğu durumlarda, kullanıcının şu anda yasal hesap sahibi olduğu biliniyor ve şifre veya diğer sorgulama yöntemlerini atlayabilirsiniz. Aksi takdirde, bu yöntemler bağlanmadan önce hesabı doğrulamak için kullanılabilir.

Google'ın yetkili olduğu durumlar:

  • email bir @gmail.com soneki var, bu bir Gmail hesabı.
  • email_verified true ve hd ayarlandı, bu bir G Suite hesabı.

Kullanıcılar, Gmail veya G Suite kullanmadan Google Hesaplarına kaydolabilir. email bir @gmail.com son eki içermediğinde ve hd yoksa, Google yetkili değildir ve kullanıcıyı doğrulamak için şifre veya başka sınama yöntemleri önerilir. email_verfied , Google, Google hesabı oluşturulduğunda kullanıcıyı başlangıçta doğruladığı için de doğru olabilir, ancak o zamandan beri üçüncü taraf e-posta hesabının sahipliği değişmiş olabilir.

Google hesabının kimlik doğrulama sisteminizde zaten mevcut olup olmadığını kontrol edin

Aşağıdaki koşullardan herhangi birinin doğru olup olmadığını kontrol edin:

  • İddia sub alanında bulunan Google Hesabı Kimliği, kullanıcı veritabanınızda yer alır.
  • Onaydaki e-posta adresi, kullanıcı veritabanınızdaki bir kullanıcıyla eşleşiyor.

Her iki koşul da doğruysa, kullanıcı zaten kaydolmuştur. Bu durumda aşağıdaki gibi bir yanıt döndürün:

HTTP/1.1 200 Success
Content-Type: application/json;charset=UTF-8

{
  "account_found":"true",
}

Google, daha sonra kullanıcıya bağlantı veren bir izin iletişim kutusu görüntüler ve bağlanmaya devam etmek için istenen kapsamlar için izin ister. Google, kullanıcının onayı alır sonra, Google bir gönderir get bağlama devam etmek için belirteç uç noktasına isteği.

Ne Google Hesabı Kimliği ne de onayda belirtilen e-posta adresi veritabanınızdaki bir kullanıcıyla eşleşmiyorsa, kullanıcı henüz kaydolmamıştır. Bu durumda, simge değişimi uç noktanızın aşağıdaki örnekte olduğu gibi "account_found": "false" belirten bir HTTP 404 hatasıyla yanıt vermesi gerekir:

HTTP/1.1 404 Not found
Content-Type: application/json;charset=UTF-8

{
  "account_found":"false",
}
Google, bir "account_found": "false" hatası içeren 404 hata yanıtını aldığında, Google kullanıcıya yeni bir hesap oluşturmak ve istenen kapsamlara erişmek için izin istemek üzere bir iletişim kutusu görüntüler. Google, kullanıcının onayını aldıktan sonra, Google token exchange uç noktanızı, create için intent parametresinin değeriyle çağırır ve istekle birlikte kullanıcının profil bilgilerini içeren bir kimlik jetonunu içerir.

Otomatik bağlamayı yönetin

Kullanıcı, Google profiline erişim izni verdikten sonra, Google, Google kullanıcısının kimliğine ilişkin imzalı bir onay içeren bir istek gönderir. İddia, kullanıcının Google Hesap Kimliğini, adını ve e-posta adresini içeren bilgileri içerir. Projeniz için yapılandırılan jeton değişimi uç noktası bu isteği işler.

İlgili Google Hesabı kimlik doğrulama sisteminizde zaten mevcutsa, jeton değişim uç noktanız kullanıcı için bir jeton döndürür. Google Hesabı mevcut bir kullanıcıyla eşleşmezse, jeton değişimi uç linking_error bir linking_error hatası ve isteğe bağlı login_hint .

İstek aşağıdaki forma sahiptir:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&intent=get&assertion=JWT&scope=SCOPES

Jeton değişimi uç noktanız aşağıdaki parametreleri işleyebilmelidir:

Jeton uç nokta parametreleri
intent Bu istekler için bu parametrenin değeri get .
grant_type Değiştirilen jetonun türü. Bu istekler için bu parametrenin değeri urn:ietf:params:oauth:grant-type:jwt-bearer .
assertion Google kullanıcısının kimliği için imzalı bir onay sağlayan bir JSON Web Jetonu (JWT). JWT, kullanıcının Google Hesap Kimliğini, adını ve e-posta adresini içeren bilgileri içerir.
scope İsteğe bağlı: Google'ı kullanıcılardan isteyecek şekilde yapılandırdığınız tüm kapsamlar.

Jeton değişim uç noktanız bağlantı talebini aldığında, JWT onayını doğrulaması ve kodunu çözmesi gerekir.

JWT onayını doğrulayın ve kodunu çözün

Diliniz için bir JWT kod çözme kitaplığı kullanarak JWT onayını doğrulayabilir ve kodunu çözebilirsiniz. Jetonun imzasını doğrulamak için Google'ın JWK veya PEM biçimlerinde bulunan genel anahtarlarını kullanın.

Kodu çözüldüğünde, JWT iddiası aşağıdaki örnekteki gibi görünür:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Jetonun imzasını doğrulayarak ek olarak, öne sürdü en verenin (doğrulamak iss alanı) olduğu https://accounts.google.com seyirci (yani, aud (alan) atanan istemci kimliğidir ve belirteç geçmediğini onaylayın exp alan).

email , email_verified ve hd alanlarını kullanarak Google'ın bir e-posta adresi barındırıp barındırmadığını ve yetkili olup olmadığını belirleyebilirsiniz. Google'ın yetkili olduğu durumlarda, kullanıcının şu anda yasal hesap sahibi olduğu biliniyor ve şifre veya diğer sorgulama yöntemlerini atlayabilirsiniz. Aksi takdirde, bu yöntemler bağlanmadan önce hesabı doğrulamak için kullanılabilir.

Google'ın yetkili olduğu durumlar:

  • email bir @gmail.com soneki var, bu bir Gmail hesabı.
  • email_verified true ve hd ayarlandı, bu bir G Suite hesabı.

Kullanıcılar, Gmail veya G Suite kullanmadan Google Hesaplarına kaydolabilir. email bir @gmail.com son eki içermediğinde ve hd yoksa, Google yetkili değildir ve kullanıcıyı doğrulamak için şifre veya başka sınama yöntemleri önerilir. email_verfied , Google, Google hesabı oluşturulduğunda kullanıcıyı başlangıçta doğruladığı için de doğru olabilir, ancak o zamandan beri üçüncü taraf e-posta hesabının sahipliği değişmiş olabilir.

Google hesabının kimlik doğrulama sisteminizde zaten mevcut olup olmadığını kontrol edin

Aşağıdaki koşullardan herhangi birinin doğru olup olmadığını kontrol edin:

  • İddia sub alanında bulunan Google Hesabı Kimliği, kullanıcı veritabanınızda yer alır.
  • Onaydaki e-posta adresi, kullanıcı veritabanınızdaki bir kullanıcıyla eşleşiyor.

Bazı durumlarda, kimlik jetonuna dayalı hesap bağlama kullanıcı için başarısız olabilir. Bunu herhangi bir nedenle error=linking_error , aşağıdaki örnekte gösterildiği gibi, belirteç değişimi uç error=linking_error belirten bir HTTP 401 hatasıyla yanıt error=linking_error :

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}
Google, linking_error ile 401 hata yanıtı aldığında, istekte aşağıdakilerle belirteç değişimi uç noktanızı çağırır:

  • intent parametre seti için create
  • Kimlik jetonuna ve kullanıcının profil bilgilerine sahip bir JWT

Google ile Oturum Açma yoluyla hesap oluşturmayı yönetin

Bir kullanıcının hizmetinizde bir hesap oluşturması gerektiğinde, Google, jeton değişim uç noktanıza intent=create değerini belirten bir istekte bulunur.

İstek aşağıdaki forma sahiptir:

POST /token HTTP/1.1
Host: oauth2.example.com
Content-Type: application/x-www-form-urlencoded

response_type=token&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&scope=SCOPES&intent=create&assertion=JWT[&NEW_ACCOUNT_INFO]

Jeton değişimi uç noktanız aşağıdaki parametreleri işleyebilmelidir:

Jeton uç noktası parametreleri
intent Bu istekler için bu parametrenin değeri create .
grant_type Değiştirilen jetonun türü. Bu istekler için, bu parametre urn:ietf:params:oauth:grant-type:jwt-bearer değerine sahiptir.
assertion Google kullanıcısının kimliğine ilişkin imzalı bir onay sağlayan bir JSON Web Jetonu (JWT). JWT, kullanıcının Google Hesap Kimliğini, adını ve e-posta adresini içeren bilgileri içerir.

assertion parametresindeki JWT, hizmetinizde yeni bir hesap oluşturmak için kullanabileceğiniz kullanıcının Google Hesap Kimliğini, adını ve e-posta adresini içerir.

Hesap oluşturma isteklerine yanıt vermek için, belirteç değişim uç noktanız aşağıdaki iki bölümdeki adımları gerçekleştirmelidir.

JWT onayını doğrulayın ve kodunu çözün

Diliniz için bir JWT kod çözme kitaplığı kullanarak JWT onayını doğrulayabilir ve kodunu çözebilirsiniz. Jetonun imzasını doğrulamak için Google'ın JWK veya PEM biçimlerinde bulunan genel anahtarlarını kullanın.

Kodu çözüldüğünde, JWT iddiası aşağıdaki örnekteki gibi görünür:

{
  "sub": "1234567890",      // The unique ID of the user's Google Account
  "iss": "https://accounts.google.com",        // The assertion's issuer
  "aud": "123-abc.apps.googleusercontent.com", // Your server's client ID
  "iat": 233366400,         // Unix timestamp of the assertion's creation time
  "exp": 233370000,         // Unix timestamp of the assertion's expiration time
  "name": "Jan Jansen",
  "given_name": "Jan",
  "family_name": "Jansen",
  "email": "jan@gmail.com", // If present, the user's email address
  "email_verified": true,   // true, if Google has verified the email address
  "hd": "example.com",      // If present, the host domain of the user's GSuite email address
                            // If present, a URL to user's profile picture
  "picture": "https://lh3.googleusercontent.com/a-/AOh14GjlTnZKHAeb94A-FmEbwZv7uJD986VOF1mJGb2YYQ",
  "locale": "en_US"         // User's locale, from browser or phone settings
}

Jetonun imzasını doğrulayarak ek olarak, öne sürdü en verenin (doğrulamak iss alanı) olduğu https://accounts.google.com seyirci (yani, aud (alan) atanan istemci kimliğidir ve belirteç geçmediğini onaylayın exp alan).

email , email_verified ve hd alanlarını kullanarak Google'ın bir e-posta adresi barındırıp barındırmadığını ve yetkili olup olmadığını belirleyebilirsiniz. Google'ın yetkili olduğu durumlarda, kullanıcının şu anda yasal hesap sahibi olduğu biliniyor ve şifre veya diğer sorgulama yöntemlerini atlayabilirsiniz. Aksi takdirde, bu yöntemler bağlanmadan önce hesabı doğrulamak için kullanılabilir.

Google'ın yetkili olduğu durumlar:

  • email bir @gmail.com soneki var, bu bir Gmail hesabı.
  • email_verified true ve hd ayarlandı, bu bir G Suite hesabı.

Kullanıcılar, Gmail veya G Suite kullanmadan Google Hesaplarına kaydolabilir. email bir @gmail.com son eki içermediğinde ve hd yoksa, Google yetkili değildir ve kullanıcıyı doğrulamak için şifre veya başka sınama yöntemleri önerilir. email_verfied , Google, Google hesabı oluşturulduğunda kullanıcıyı başlangıçta doğruladığı için de doğru olabilir, ancak o zamandan beri üçüncü taraf e-posta hesabının sahipliği değişmiş olabilir.

Kullanıcı bilgilerini doğrulayın ve yeni hesap oluşturun

Aşağıdaki koşullardan herhangi birinin doğru olup olmadığını kontrol edin:

  • İddia sub alanında bulunan Google Hesabı Kimliği, kullanıcı veritabanınızda yer alır.
  • Onaydaki e-posta adresi, kullanıcı veritabanınızdaki bir kullanıcıyla eşleşiyor.

Her iki koşul da doğruysa, kullanıcıdan mevcut hesabını Google Hesabı ile bağlamasını isteyin. Bunu yapmak için isteğe, error=linking_error ve kullanıcının e-posta adresini login_hint olarak veren bir HTTP 401 hatasıyla login_hint . Aşağıdaki örnek bir yanıttır:

HTTP/1.1 401 Unauthorized
Content-Type: application/json;charset=UTF-8

{
  "error":"linking_error",
  "login_hint":"foo@bar.com"
}

Google, linking_error ile bir 401 hata yanıtı linking_error , Google kullanıcıyı, parametre olarak login_hint ile yetkilendirme uç login_hint gönderir. Kullanıcı, tarayıcılarındaki OAuth bağlantı akışını kullanarak hesap bağlama işlemini tamamlar.

Her iki koşul da doğru değilse, JWT'de sağlanan bilgilerle yeni bir kullanıcı hesabı oluşturun. Yeni hesapların genellikle bir şifre seti yoktur. Kullanıcıların uygulamanızın yüzeylerinde Google'da oturum açmasını sağlamak için diğer platformlara Google Oturum Açma eklemeniz önerilir. Alternatif olarak, kullanıcının diğer platformlarda oturum açmak için bir parola belirlemesine izin vermek için parola kurtarma akışınızı başlatan bir bağlantıyı kullanıcıya e-posta ile gönderebilirsiniz.

Oluşturma tamamlandığında, bir erişim jetonu jetonunu yenileyin ve aşağıdaki örnekte olduğu gibi, HTTPS yanıtınızın gövdesinde bir JSON nesnesindeki değerleri döndürün:

{
  "token_type": "Bearer",
  "access_token": "ACCESS_TOKEN",

  "expires_in": SECONDS_TO_EXPIRATION
}

Uygulamanızı doğrulama

OAuth 2.0 Playground aracını kullanarak uygulamanızı doğrulayabilirsiniz.

Araçta aşağıdaki adımları uygulayın:

  1. OAuth 2.0 Yapılandırması penceresini açmak için Yapılandırma tıklayın.
  2. OAuth akışı alanında İstemci tarafı'nı seçin.
  3. OAuth Uç Noktaları alanında Özel'i seçin.
  4. OAuth 2.0 uç noktanızı ve ilgili alanlarda Google'a atadığınız istemci kimliğini belirtin.
  5. 1. Adım bölümünde herhangi bir Google kapsamı seçmeyin. Bunun yerine, bu alanı boş bırakın veya sunucunuz için geçerli bir kapsam (veya OAuth kapsamlarını kullanmıyorsanız rastgele bir dize) yazın. İşiniz bittiğinde, API'leri Yetkilendir'i tıklayın.
  6. 2. Adım ve 3. Adım bölümlerinde, OAuth 2.0 akışını inceleyin ve her adımın amaçlandığı gibi çalıştığını doğrulayın.

Google Hesap Bağlama Demo aracını kullanarak uygulamanızı doğrulayabilirsiniz.

Araçta aşağıdaki adımları uygulayın:

  1. Google ile Oturum Aç düğmesini tıklayın.
  2. Bağlamak istediğiniz hesabı seçin.
  3. Servis kimliğini girin.
  4. İsteğe bağlı olarak erişim talep edeceğiniz bir veya daha fazla kapsam girin.
  5. Demoyu Başlat'ı tıklayın.
  6. İstendiğinde, bağlantı isteğine onay verebileceğinizi ve reddedebileceğinizi onaylayın.
  7. Platformunuza yönlendirildiğinizi onaylayın.