Google ile Giriş Yapmak İçin OAuth2'yi Kullandığım Bir Uygulamadan Nasıl Çıkış Yapılır?


85

Uygulamamda jsapi kullanarak Google oturumu kapatmayı gerçekleştirdim.

Ben url kullanılan https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx Google'a bağlamak ve sonra https://www.googleapis.com/plus/v1/people/xxxxxx kullanıcı verilerini almak için google profilinden.

Şimdi, uygulamamdan bir düğmeyi tıklarken kullanıcının Google'dan çıkışını yapmam gerekiyor. Bunu JavaScript'te nasıl uygulayabilirim veya en azından kullanıcı her oturum açtığında Google giriş sayfasına sormalıdır.

Denedim approval_prompt=forceama çalışmıyor gibi görünüyor.

Yanıtlar:


246

OAuth'a Genel Bakış: Kullanıcı Olduğunu Söylediği Kişi mi ?:

Stack Overflow'a giriş yapmak için "Google ile Giriş Yap" seçeneği gibi OAuth'u kullanıp kullanmadığınızdan emin değilim, ancak bu özelliği kullandığınızda, Stack Overflow yalnızca Google'a kim olduğunuzu bilip bilmediğini soruyor:

"Yo Google, bu Vinesh arkadaş vinesh.e@gmail.com'un kendisi olduğunu iddia ediyor, bu doğru mu?"

Zaten giriş yaptıysanız, Google EVET diyecektir. Değilse, Google şunu söyleyecektir:

"Bir saniye Stack Overflow bekle, bu adamın kimliğini doğrulayacağım ve Google hesabı için doğru şifreyi girebilirse, o zaman odur".

Google şifrenizi girdiğinizde Google, Stack Overflow'a sizin söylediğiniz kişi olduğunuzu söyler ve Stack Overflow oturumunuzu açar.

Uygulamanızın çıkış zaman, çıkış yapmayı ediyoruz senin app:

OAuth'a yeni başlayan geliştiricilerin bazen kafalarının biraz karıştığı yer burasıdır ... Google ve Stack Overflow, Assembla, Vinesh'in çok havalı web uygulaması farklı varlıklardır ve Google, Vinesh'in harika web uygulamasındaki hesabınız hakkında hiçbir şey bilmiyor ve yardımcısı profil bilgilerine erişmek için kullandığınız API aracılığıyla ifşa edilenlerin yanı sıra tam tersi.

Kullanıcınız çıkış yaptığında, Google'dan çıkış yapmıyor, uygulamanızdan, Stack Overflow'dan veya Assembla'dan veya kullanıcının kimliğini doğrulamak için Google OAuth kullanılan web uygulamasından çıkış yapıyor.

Aslında, tüm Google hesaplarımdan çıkış yapabilirim ve yine de Stack Overflow'da oturum açabilirim. Uygulamanız, kullanıcının kim olduğunu öğrendikten sonra, o kişi Google’dan çıkabilir. Google'a artık ihtiyaç yok.

Bununla birlikte, yapmak istediğiniz şey, kullanıcının gerçekten size ait olmayan bir hizmetten çıkış yapmasıdır. Şöyle düşünün: Bir kullanıcı olarak, Google hesabımla 5 farklı hizmete giriş yapsam ne kadar sinirleneceğimi düşünüyorsunuz, ardından bunlardan birinden ilk çıkış yaptığımda, Gmail hesabıma giriş yapmam gerekiyor yine o uygulama geliştiricisi, uygulamasından çıkış yaptığımda, benim de Google'dan çıkış yapmam gerektiğine karar verdi. Bu çok çabuk eskimeye başlayacak. Kısacası, gerçekten bunu yapmak istemiyorsunuz ...

Yeh yeh, her neyse, yine de kullanıcının Google’dan çıkış yapmasını istiyorum, sadece bunu nasıl yapacağımı söyle bana?

Bununla birlikte, yine de bir kullanıcının Google oturumunu kapatmak istiyorsanız ve iş akışını çok iyi bir şekilde kesintiye uğrattığınızı fark ederseniz, çıkış URL'sini Google hizmetleri çıkış düğmesinden dinamik olarak oluşturabilir ve ardından bunu kullanarak çağırabilirsiniz. bir img öğesi veya bir komut dosyası etiketi:

<script type="text/javascript" 
    src="https://mail.google.com/mail/u/0/?logout&hl=en" />

VEYA

<img src="https://mail.google.com/mail/u/0/?logout&hl=en" />

VEYA

window.location = "https://mail.google.com/mail/u/0/?logout&hl=en";

Kullanıcınızı çıkış sayfasına yeniden yönlendirirseniz veya web alanları arası kısıtlanmamış bir öğeden çağırırsanız, kullanıcının Google'daki oturumu kapatılır.

Bunun, kullanıcının hesabınızdan çıkış yapacağı anlamına gelmediğini unutmayın . uygulaması, yalnızca Google. :)

Özet:

Aklınızda bulundurmanız gereken önemli olan, uygulamanızdan çıkış yaptığınızda, kullanıcıya şifreyi yeniden girmesine gerek olmamasıdır. Bütün mesele bu! Google'a karşı kimlik doğrulaması yapar, böylece kullanıcının kullandığı her web uygulamasında şifresini tekrar tekrar girmek zorunda kalmaz. Alışmak biraz zaman alır, ancak kullanıcı Google'da oturum açtığı sürece uygulamanızın kullanıcının söylediği kişi olup olmadığı konusunda endişelenmesine gerek olmadığını bilin.

Google Profil bilgilerini OAuth ile kullanarak bir projede sizinle aynı uygulamaya sahibim. Denemeye çalıştığınız şeyin aynısını denedim ve tekrar tekrar Google'a giriş yapmak zorunda kaldıklarında insanları gerçekten sinirlendirmeye başladı, bu yüzden onları Google'dan çıkmayı bıraktık. :)


8
Değerli zamanınız ve böylesine geniş bir açıklama için teşekkür ederiz. Ama müvekkilimin farklı bir görüşü var. Kullanıcının, herkese açık bir sistemden google girişini kullanarak uygulamaya giriş yaptığını ve uygulamadan çıkış yaptığını varsayalım. Google'dan da çıkış yaptığını düşünüyor olabilir ama aslında değil! Sistemi daha sonra kullanan diğer herhangi bir kullanıcı, google hesabına erişecektir.
Vinesh EG

13
Daha sonra kullanıcılarınızın da Google'dan çıkması gerekir. Önemli olan, 2 hizmete giriş yapıyor olmaları. Kullanıcılarınızın OAuth'u nasıl kullanacaklarını öğrenmesi gerekir. :) Müşterinizi ve kullanıcıları eğitmenizi öneririm. Gerekirse, devam et ve onlara göster. Uygulanması uzun sürmemeli ve daha sonra ne kadar kötü olduğunu anladığınızda geri alınmamalıdır. :) Bunu gerçekten yapana ve LoopToDo'dan her çıkış yaptığımda Google'da tekrar oturum açmanın ne kadar bir PITA olduğunu görene kadar kendime inanmadım. "Vinesh'in harika uygulamasından çıkış yaptınız,> Google'dan da çıkış yapmayı unutmayın <!"
jmort253

1
@ jmort253 Evet, artık izin vermeleri gerekmediğini anlıyorum, ancak bunları tekrar nasıl doğrulamalıyım? Lütfen yaptığım şu soruya bakın (
OAuth'ta

2
@ jmort253 Ancak, kullanıcı için "bağlantıyı kes" kelimesi uygulamadan tamamen çıkış anlamına gelirse .. Kimlik bilgilerini tekrar yazmadan otomatik olarak yeniden oturum açtığı için 2 sorun vardır; kullanıcı, bağlantımı kestiğimde ne olduğunu merak ediyor ve bilgilerime sahip olmamalı ve ikinci kullanıcı farklı bir hesapta oturum açamayacak çünkü kimlik doğrulama sağlayıcı bir zorunlu oturum açma yöntemi sağlamadıkça her zaman otomatik oturum açacaktır. Dolayısıyla bu durumda, çıkış yapmak istenir, böylece çerezleri geçersiz kılabilir ve artık istemci tarafında nasıl yönetildiği konusunda endişelenmenize gerek kalmaz.
darewreck

1
Bu, kullanıcının Google ile giriş yaptığı Electron uygulamaları için kullanışlıdır! Bu durumda, bu kişilerin Google'dan çıkışları, yalnızca bir uygulamadan (Electron uygulaması) çıkışlarına neden olur.
trusktr

21

Çıkış yapabilir ve sitenize yeniden yönlendirebilirsiniz:

var logout = function() {
    document.location.href = "https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://www.example.com";
}

1
En sonunda! Teşekkür ederim! Bir gündür nasıl çıkış yapacağımı bulmaya, bir sonraki kullanıcının e-postayı veya şifreyi bilmeden sadece bir tıklama ile önceki kullanıcı olarak giriş yapmasını engellemeye çalışıyorum ...
bazı


1
Teşekkürler. Bunu yıllardır arıyordum.
sakib11

6

Benim için işe yarıyor (java - android)

void RevokeAcess()
{
    try{
    HttpClient client = new DefaultHttpClient();
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+ACCESS_TOKEN);
    org.apache.http.HttpResponse response = client.execute(post);
    }
    catch(IOException e)
    {
    }
    CookieManager.getInstance().removeAllCookie(); // this is clear the cookies which tends to same user in android web view
}

Android'de AsyncTask'ta bu işlevi çağırmalısınız


2
Bunun işe yarayacağı doğru olsa da, soru aslında Java değil JavaScript ile ilgili.
jmort253

2
İhtiyacınız olan tek şeyin bir jeton olması kulağa garip geliyor, google'ı herkesi zorla çıkış yapmaya zorlayabilirsiniz.
Arşimet Trajano

Sizi cihazdan çıkarmaz, yalnızca uygulamadan (android'de) çıkış yapar.
Vinoj John Hosan

2
Google oauth2 belgelerinin bazılarına bakıldığında tipik bir erişim belirteci şöyle görünür. "1 / fFAGRNJru1FTz70BzhT3Zg" "1 /" kısmının sadece insanların sayıyı daha kolay belirlemesi için olduğunu varsayarsak. Halen iki alfabeniz (büyük ve küçük harf) artı 22 karakter uzunluğunda on sayısal rakamınız var. Bu 22 ^ (26 * 2 + 10) olup 1.6990502e + 83'e eşittir. Veya bilinen evrendeki atomların sayısı hakkında . Bunu HTTP üzerinden zorlarken iyi şanslar kaba kuvvet. ;)
Chris Balogh

Bu, tanımlama bilgilerini kaldırmadan önce çalınabilecek yenileme belirtecini iptal ediyor gibi görünmüyor (eğer orada depolanmışsa).
Ondrej Galbavý


1

Bu, kullanıcının uygulamadaki oturumunu kapatmak için çalışır, ancak Google'da değil.

var auth2 = gapi.auth2.getAuthInstance();
auth2.signOut().then(function () {
  console.log('User signed out.');
});

Kaynak: https://developers.google.com/identity/sign-in/web/sign-in


1
bu, kullanıcının google hesabındaki oturumunu tamamen kapatmaz. Sadece AuthInstancekullandığınız şeyi yok eder . Sizin kaynak kendisi "... diyor sen almalarını etkinleştirebilirsiniz Google'dan oturum açmadan uygulamasından çıkış ... "
Roshana Pitigala

@RoshanaPitigala, belirtmek için yanıtı güncelledi. Bu cevap, sorunun başlığının cevabıdır, ancak soruyu daha ayrıntılı olarak okuduktan sonra başlığın yanlış yazıldığını anlarsınız. Bu cevap, sorunun başlığına göre burayı yapan herkes için geçerli.
CamHart

1

Ouath yalnızca Google örneğini boş yapar, dolayısıyla siz Google dışında kalırsınız. Şimdi mimari böyle yapılır. Uygulamanızdan çıkış yapmak kirli bir işse, Google'dan çıkış yapmak kirli bir işse, ancak gereksinim aynı şeyi gerektiriyorsa yardımcı olamaz. Bu nedenle, signOut () işlevinize aşağıdakileri ekleyin. Projem bir Angular 6 uygulamasıydı:

document.location.href = " https://www.google.com/accounts/Logout?continue=https://appengine.google.com/_ah/logout?continue=http://localhost:4200 ";

İşte localhost: 4200, uygulamamın URL'sidir. Giriş sayfanız xyz.com ise, bunu girin.


1

bu kod oturumu kapatmak için çalışacak

    <script>
      function signOut() 
      {
        var auth2 = gapi.auth2.getAuthInstance();
        auth2.signOut().then(function () {   
        console.log('User signed out.');   
        auth2.disconnect();   
      }); 
        auth2.disconnect();
      } 
    </script>

1

Yalnızca uygulamadan çıkış yapmak, ancak Gmail'den çıkmak için:

window.gapi.load('auth2', () => {
      window.gapi.auth2
        .init({
          client_id:
            '<Your client id configired on google console>'
        })
        .then(() => {
          window.gapi.auth2
            .getAuthInstance()
            .signOut()
            .then(function() {
              console.log('User signed out.');
            });
        });
    });

Yukarıdaki ReactJs kodumda kullanıyorum.


0

Bunu, oturum açarken jetonu oturumda saklayarak ve oturum kapatmayı tıkladığında jetona erişerek başarabiliriz.

    String _accessToken=(String)session.getAttribute("ACCESS_TOKEN");
    if(_accessToken!=null)
    {
        StringBuffer path=httpRequest.getRequestURL();
        reDirectPage="https://www.google.com/accounts/Logout?
        continue=https://appengine.google.com/_ah/logout?
        continue="+path;
    }
    response.sendRedirect(reDirectPage);

0

Görünüşe göre Google kısa süre önce iptal işlemleriyle ilgili bir şeyi bozdu (bizim için 400 hata döndürmeye başladı). Şimdi aramak zorundasın

auth2.disconnect ();

Bizim durumumuzda, bağlantı kesme çağrısının tamamlanması için birkaç saniye beklememiz gerekir, aksi takdirde oturum açma kodu tamamlanmadan önce yeniden yetkilendirilir. Google'ın bağlantı kesme yönteminden bir söz vermesi iyi olur.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.