จะออกจากระบบแอปพลิเคชันที่ฉันใช้ OAuth2 เพื่อเข้าสู่ระบบด้วย Google ได้อย่างไร


86

ในแอปพลิเคชันของฉันฉันใช้การลงชื่อเข้าใช้ Google โดยใช้ jsapi

ฉันใช้ URL https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxxเพื่อเชื่อมต่อกับ Google จากนั้นhttps://www.googleapis.com/plus/v1/people/xxxxxxเพื่อรับข้อมูลผู้ใช้ จากโปรไฟล์ Google

ตอนนี้ฉันต้องออกจากระบบผู้ใช้จาก Google ในขณะที่คลิกปุ่มจากแอปพลิเคชันของฉัน ฉันจะใช้สิ่งนี้ใน JavaScript ได้อย่างไรหรืออย่างน้อยก็ต้องถามหน้าการเข้าสู่ระบบของ Google ทุกครั้งที่ผู้ใช้ลงชื่อเข้าใช้

ฉันลองapproval_prompt=forceแล้ว แต่ดูเหมือนจะไม่ได้ผล

คำตอบ:


247

ภาพรวมของ OAuth: ผู้ใช้ที่เขา / เธอบอกว่าเขาคือใคร:

ฉันไม่แน่ใจว่าคุณใช้ OAuth เพื่อลงชื่อเข้าใช้ Stack Overflow หรือไม่เช่นตัวเลือก "เข้าสู่ระบบด้วย Google" แต่เมื่อคุณใช้คุณลักษณะนี้ Stack Overflow จะถาม Google ว่าคุณรู้หรือไม่:

"ยอ Google เพื่อนของ Vinesh คนนี้อ้างว่า vinesh.e@gmail.com คือเขาจริงหรือ?"

หากคุณลงชื่อเข้าใช้แล้ว Google จะระบุว่าใช่ หากไม่เป็นเช่นนั้น Google จะพูดว่า:

"รอสักครู่ Stack Overflow ฉันจะตรวจสอบความถูกต้องของผู้หญิงคนนี้และถ้าเขาสามารถป้อนรหัสผ่านที่ถูกต้องสำหรับบัญชี Google ของเขาก็แสดงว่าเป็นเขา"

เมื่อคุณป้อนรหัสผ่าน Google Google จะบอก Stack Overflow ว่าคุณคือใครและ Stack Overflow จะบันทึกคุณเข้า

เมื่อคุณออกจากระบบแอปคุณกำลังออกจากระบบแอปของคุณ :

นี่คือสิ่งที่นักพัฒนาที่เพิ่งเริ่มใช้ OAuth บางครั้งอาจสับสนเล็กน้อย ... Google และ Stack Overflow, Assembla, เว็บแอปพลิเคชันที่ยอดเยี่ยมของ Vinesh เป็นเอนทิตีที่แตกต่างกันทั้งหมดและ Google ไม่ทราบอะไรเกี่ยวกับบัญชีของคุณบนเว็บแอปที่ยอดเยี่ยมของ Vinesh และรอง ในทางกลับกันนอกเหนือจากสิ่งที่เปิดเผยผ่าน API ที่คุณใช้เพื่อเข้าถึงข้อมูลโปรไฟล์

เมื่อผู้ใช้ของคุณออกจากระบบไม่ได้ออกจากระบบ Google แสดงว่ากำลังออกจากระบบแอปของคุณหรือ Stack Overflow หรือ Assembla หรือเว็บแอปพลิเคชันใดก็ตามที่ใช้ Google OAuth ในการตรวจสอบสิทธิ์ผู้ใช้

อันที่จริงฉันสามารถออกจากระบบบัญชี Google ทั้งหมดของฉันและยังคงเข้าสู่ระบบ Stack Overflow เมื่อแอปของคุณทราบว่าผู้ใช้คือใครบุคคลนั้นจะสามารถออกจากระบบ Google ได้ Google ไม่จำเป็นอีกต่อไป

ด้วยเหตุนี้สิ่งที่คุณขอให้ทำคือนำผู้ใช้ออกจากบริการที่ไม่ได้เป็นของคุณจริงๆ ลองคิดดู: ในฐานะผู้ใช้คุณคิดว่าฉันจะรำคาญแค่ไหนถ้าฉันเข้าสู่ระบบ 5 บริการที่แตกต่างกันด้วยบัญชี Google ของฉันจากนั้นในครั้งแรกที่ฉันออกจากหนึ่งในนั้นฉันต้องลงชื่อเข้าใช้บัญชี Gmail ของฉัน อีกครั้งเพราะนักพัฒนาแอปนั้นตัดสินใจว่าเมื่อฉันออกจากระบบแอปพลิเคชันของเขาฉันควรออกจากระบบ Google ด้วยหรือไม่? มันจะแก่เร็วจริงๆ ในระยะสั้นคุณไม่ต้องการทำสิ่งนี้จริงๆ ...

ใช่แล้วยังไงก็ตามฉันยังต้องการนำผู้ใช้ออกจาก Google เพียงบอกฉันว่าฉันจะทำสิ่งนี้ได้อย่างไร

จากที่กล่าวมาหากคุณยังไม่ต้องการนำผู้ใช้ออกจาก Google และตระหนักว่าคุณอาจขัดขวางขั้นตอนการทำงานของพวกเขาได้เป็นอย่างดีคุณสามารถสร้าง URL การออกจากระบบแบบไดนามิกจากปุ่มออกจากระบบบริการ Google ปุ่มใดปุ่มหนึ่งจากนั้นเรียกใช้โดยใช้ องค์ประกอบ img หรือแท็กสคริปต์:

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

หรือ

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

หรือ

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

หากคุณเปลี่ยนเส้นทางผู้ใช้ของคุณไปยังหน้าออกจากระบบหรือเรียกใช้จากองค์ประกอบที่ไม่ จำกัด การข้ามโดเมนผู้ใช้จะออกจากระบบ Google

โปรดทราบว่านี่ไม่ได้หมายความว่าผู้ใช้จะออกจากระบบแอปพลิเคชันของคุณแต่เป็น Google เท่านั้น :)

สรุป:

สิ่งสำคัญที่คุณควรทราบก็คือเมื่อคุณออกจากระบบแอปคุณไม่จำเป็นต้องให้ผู้ใช้ป้อนรหัสผ่านซ้ำ นั่นคือจุดรวม! ตรวจสอบสิทธิ์กับ Google ดังนั้นผู้ใช้จึงไม่จำเป็นต้องป้อนรหัสผ่านซ้ำแล้วซ้ำเล่าในแต่ละแอปพลิเคชันบนเว็บที่ตนใช้ ต้องใช้เวลาในการทำความคุ้นเคย แต่ทราบว่าตราบใดที่ผู้ใช้ลงชื่อเข้าใช้ Google แอปของคุณก็ไม่จำเป็นต้องกังวลว่าผู้ใช้จะเป็นคนที่เขาพูดหรือไม่

ฉันมีการใช้งานในโปรเจ็กต์เช่นเดียวกับคุณโดยใช้ข้อมูลโปรไฟล์ Google กับ OAuth ฉันได้ลองสิ่งเดียวกับที่คุณต้องการลองและมันเริ่มทำให้คนอื่นโกรธเมื่อต้องลงชื่อเข้าใช้ Google ซ้ำแล้วซ้ำเล่าดังนั้นเราจึงหยุดนำพวกเขาออกจาก Google :)


8
ขอบคุณสำหรับเวลาอันมีค่าของคุณและคำอธิบายมากมาย แต่ลูกค้าของฉันมีความคิดเห็นที่แตกต่างออกไป สมมติว่าผู้ใช้ล็อกอินเข้าสู่แอปพลิเคชันโดยใช้การเข้าสู่ระบบของ Google จากระบบสาธารณะและออกจากระบบแอปพลิเคชัน เขาอาจจะคิดว่าออกจาก google แล้วด้วยซ้ำ แต่จริงๆแล้วไม่ใช่! ผู้ใช้รายอื่นที่ใช้ระบบในภายหลังจะสามารถเข้าถึงบัญชี Google ได้
Vinesh EG

13
จากนั้นผู้ใช้ของคุณต้องออกจากระบบ Google ด้วย ประเด็นคือพวกเขาเข้าสู่ระบบ 2 บริการ ผู้ใช้ของคุณต้องเรียนรู้วิธีใช้ OAuth :) ฉันขอแนะนำให้ให้ความรู้กับลูกค้าและผู้ใช้ของคุณ ถ้าต้องไปแสดงให้ดู ไม่ควรใช้เวลานานในการใช้งานแล้วเลิกทำในภายหลังเมื่อคุณรู้ว่ามันแย่มากแค่ไหน :) ฉันไม่เชื่อด้วยตัวเองจนกระทั่งฉันได้ทำสิ่งนี้จริง ๆ และเห็นว่าต้องใช้ PITA มากแค่ไหนในการกลับเข้าสู่ Google อีกครั้งทุกครั้งที่ฉันออกจาก LoopToDo อาจเป็นข้อความ "คุณออกจากระบบแอปสุดเจ๋งของ Vinesh แล้วอย่าลืม> ออกจากระบบ Google ด้วย <!"
jmort253

1
@ jmort253 ใช่ฉันเข้าใจว่าพวกเขาไม่จำเป็นต้องให้สิทธิ์อีกต่อไป แต่ฉันจะตรวจสอบสิทธิ์อีกครั้งได้อย่างไร โปรดดูคำถามที่ฉันได้ถามไว้ (ฉันยังใหม่กับ OAuth): stackoverflow.com/questions/37515836/…
Apoorv Kansal

2
@ jmort253 อย่างไรก็ตามคำว่า "ยกเลิกการเชื่อมต่อ" สำหรับผู้ใช้จะหมายถึงการล็อกออกทั้งหมดของแอปพลิเคชัน .. เนื่องจากการล็อกอัตโนมัติกลับเข้าโดยไม่ต้องพิมพ์ข้อมูลประจำตัวอีกจึงมี 2 ประเด็นคือ ผู้ใช้สงสัยว่าเกิดอะไรขึ้นฉันเพิ่งยกเลิกการเชื่อมต่อและไม่ควรมีข้อมูลของฉันและผู้ใช้คนที่สองจะไม่สามารถลงชื่อเข้าใช้บัญชีอื่นได้เนื่องจากจะเข้าสู่ระบบอัตโนมัติเสมอเว้นแต่ผู้ให้บริการรับรองความถูกต้องจะให้วิธีบังคับเข้าสู่ระบบ ดังนั้นในกรณีนี้การออกจากระบบจึงเป็นสิ่งที่พึงปรารถนาเพื่อที่จะทำให้คุกกี้เป็นโมฆะและคุณไม่ต้องกังวลว่าจะจัดการอย่างไรในฝั่งไคลเอ็นต์อีกต่อไป
Darewreck

1
สิ่งนี้มีประโยชน์สำหรับแอพพลิเคชั่น Electron ที่ผู้ใช้ล็อกอินด้วย Google! ในกรณีนี้การออกจาก Google จะเป็นการบันทึกพวกเขาออกจากแอปเดียว (แอป Electron)
trusktr

21

คุณสามารถออกจากระบบและเปลี่ยนเส้นทางไปยังไซต์ของคุณ:

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
ในที่สุด! ขอขอบคุณ! ฉันพยายามหาวิธีล็อกเอาต์มาตลอดทั้งวันเพื่อป้องกันไม่ให้ผู้ใช้รายต่อไปเข้าสู่ระบบเหมือนผู้ใช้ก่อนหน้าเพียงแค่คลิกโดยไม่ทราบอีเมลหรือรหัสผ่าน ...
บาง

1
ไม่ได้ผลเพราะมันเพียงพอที่จะเปิดหน้าเดียวกันในแท็บอื่นและคุณเข้าสู่ระบบอีกครั้ง ...
BartłomiejSemańczyk

1
ขอบคุณ. ฉันมองหาสิ่งนี้มาหลายปีแล้ว
sakib11

6

สำหรับฉันมันใช้งานได้ (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
}

คุณต้องเรียกใช้ฟังก์ชันนี้ใน AsyncTask ใน Android


2
แม้ว่าจะเป็นเรื่องจริงที่จะใช้งานได้ แต่คำถามก็คือถามเกี่ยวกับ JavaScript ไม่ใช่ Java
jmort253

2
ฟังดูแปลก ๆ ที่สิ่งที่คุณต้องการคือโทเค็นคุณสามารถบังคับให้ Google บังคับให้ทุกคนออกจากระบบได้
Archimedes Trajano

มันจะไม่ออกจากระบบคุณจากอุปกรณ์มันจะออกจากระบบเฉพาะแอปพลิเคชัน (ใน Android)
Vinoj John Hosan

2
จากการดูเอกสาร Google oauth2บางส่วนโทเค็นการเข้าถึงทั่วไปจะมีลักษณะเช่นนี้ "1 / fFAGRNJru1FTz70BzhT3Zg" สมมติว่าส่วน "1 /" มีไว้เพื่อให้มนุษย์ระบุหมายเลขได้ง่ายขึ้น คุณยังคงมีตัวอักษรสองตัว (ตัวพิมพ์ใหญ่และตัวพิมพ์เล็ก) บวกตัวเลขสิบหลักที่มีความยาว 22 อักขระ นั่นคือ 22 ^ (26 * 2 + 10) ซึ่งเท่ากับ 1.6990502e + 83 หรือเกี่ยวกับจำนวนของอะตอมในจักรวาลที่รู้จักกัน ขอให้โชคดีที่บังคับให้ผ่าน HTTP ;)
Chris Balogh

ดูเหมือนจะไม่เพิกถอนโทเค็นการรีเฟรชซึ่งอาจถูกขโมยก่อนที่จะลบคุกกี้ (หากเก็บไว้ที่นั่น)
Ondrej Galbavý

1

คุณสามารถสร้างปุ่มออกจากระบบและเพิ่มลิงค์นี้ลงไปจากนั้นมันจะนำคุณออกจากแอพและจะเปลี่ยนเส้นทางไปยังไซต์ที่คุณต้องการ:

https://appengine.google.com/_ah/logout?continue=http://www.YOURSITE.com

เพียงแค่สลับ YOURSITE กับเว็บไซต์ของคุณ


1

วิธีนี้ใช้เพื่อลงชื่อผู้ใช้ออกจากแอปพลิเคชัน แต่ไม่ใช่ Google

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

ที่มา: https://developers.google.com/identity/sign-in/web/sign-in


1
สิ่งนี้จะไม่ทำให้ผู้ใช้ออกจากระบบบัญชี Google ของตนโดยสมบูรณ์ มันทำลายสิ่งAuthInstanceที่คุณใช้เท่านั้น แหล่งที่มาของคุณระบุว่า ... " คุณสามารถให้ผู้ใช้ออกจากระบบแอปของคุณได้โดยไม่ต้องออกจากระบบ Google ... "
Roshana Pitigala

@RoshanaPitigala อัพเดทคำตอบระบุ. คำตอบนี้เป็นคำตอบของชื่อคำถาม แต่เมื่อคุณอ่านคำถามในรายละเอียดเพิ่มเติมแล้วคุณจะเข้าใจว่าชื่อนั้นเขียนไม่ถูกต้อง คำตอบนี้ใช้ได้กับทุกคนที่ตั้งไว้ที่นี่ตามชื่อของคำถาม
CamHart

1

คำสาบานทำให้อินสแตนซ์ของ Google เป็นโมฆะดังนั้นคุณจึงออกจาก Google ตอนนี้เป็นวิธีการสร้างสถาปัตยกรรม การออกจากระบบ Google หากคุณออกจากระบบแอปของคุณเป็นงานที่สกปรก แต่ไม่สามารถช่วยได้หากข้อกำหนดกำหนดเหมือนกัน ดังนั้นเพิ่มสิ่งต่อไปนี้ในฟังก์ชัน signOut () ของคุณ โครงการของฉันคือแอป Angular 6:

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

ที่นี่ localhost: 4200 คือ URL ของแอปของฉัน หากหน้าเข้าสู่ระบบของคุณคือ xyz.com ให้ป้อนข้อมูลนั้น



1

ในการออกจากระบบจากแอปเท่านั้น แต่ไม่ใช่ Gmail:

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.');
            });
        });
    });

ฉันใช้ข้างต้นในโค้ด ReactJs ของฉัน


0

ฉันหวังว่าเราจะทำได้โดยการจัดเก็บโทเค็นในเซสชันขณะเข้าสู่ระบบและเข้าถึงโทเค็นเมื่อเขาคลิกที่ออกจากระบบ

    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

ดูเหมือนว่าเมื่อเร็ว ๆ นี้ Google ได้ขัดข้องบางอย่างด้วยการเพิกถอน (เริ่มส่งคืนข้อผิดพลาด 400 ข้อให้เรา) ตอนนี้คุณต้องโทร

auth2.disconnect ();

ในกรณีของเราเราต้องรอสองสามวินาทีเพื่อให้การโทรยกเลิกการเชื่อมต่อเสร็จสมบูรณ์มิฉะนั้นรหัสลงชื่อเข้าใช้จะอนุมัติอีกครั้งก่อนที่จะเสร็จสิ้น คงจะดีถ้า google คืนสัญญาจากวิธีตัดการเชื่อมต่อ


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.