Làm thế nào để Đăng xuất Ứng dụng Tôi đã Sử dụng OAuth2 Để Đăng nhập Với Google?


84

Trong ứng dụng của mình, tôi đã triển khai Google signout bằng jsapi.

Tôi đã sử dụng url https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxxxx để kết nối với Google và sau đó https://www.googleapis.com/plus/v1/people/xxxxxx để lấy dữ liệu người dùng từ hồ sơ trên google.

Bây giờ tôi cần đăng xuất người dùng khỏi Google trong khi nhấp vào nút từ ứng dụng của mình. Làm cách nào tôi có thể triển khai điều này trong JavaScript, hoặc ít nhất nó phải hỏi trang đăng nhập Google mỗi khi người dùng đăng nhập.

Tôi đã thử approval_prompt=force, nhưng dường như không hiệu quả.

Câu trả lời:


243

Tổng quan về OAuth: Người dùng có nói họ là ai không ?:

Tôi không chắc liệu bạn có sử dụng OAuth để đăng nhập vào Stack Overflow hay không, chẳng hạn như tùy chọn "Đăng nhập bằng Google", nhưng khi bạn sử dụng tính năng này, Stack Overflow chỉ hỏi Google xem Google có biết bạn là ai không:

"Yo Google, anh bạn Vinesh này tuyên bố rằng vinesh.e@gmail.com là anh ta, điều đó có đúng không?"

Nếu bạn đã đăng nhập, Google sẽ thông báo CÓ. Nếu không, Google sẽ nói:

"Chờ một chút Stack Overflow, tôi sẽ xác thực anh bạn này và nếu anh ta có thể nhập đúng mật khẩu cho tài khoản Google của mình, thì đó là anh ta".

Khi bạn nhập mật khẩu Google của mình, Google sau đó sẽ cho Stack Overflow biết bạn là ai như bạn nói và Stack Overflow sẽ đăng nhập cho bạn.

Khi bạn đăng xuất khỏi ứng dụng của mình, bạn đang đăng xuất khỏi ứng dụng của mình :

Đây là nơi mà các nhà phát triển mới sử dụng OAuth đôi khi hơi bối rối ... Google và Stack Overflow, Assembla, ứng dụng web-rất-hay-tuyệt-vời của Vinesh, đều là các thực thể khác nhau và Google không biết gì về tài khoản của bạn trên ứng dụng web tuyệt vời của Vinesh ngược lại, ngoài những gì được hiển thị qua API mà bạn đang sử dụng để truy cập thông tin hồ sơ.

Khi người dùng của bạn đăng xuất, họ không đăng xuất khỏi Google, họ đang đăng xuất khỏi ứng dụng của bạn hoặc Stack Overflow hoặc Assembla hoặc bất kỳ ứng dụng web nào đã sử dụng Google OAuth để xác thực người dùng.

Trên thực tế, tôi có thể đăng xuất khỏi tất cả các tài khoản Google của mình mà vẫn đăng nhập vào Stack Overflow. Sau khi ứng dụng của bạn biết người dùng là ai, người đó có thể đăng xuất khỏi Google. Google không còn cần thiết nữa.

Như đã nói, những gì bạn yêu cầu làm là đăng xuất người dùng khỏi một dịch vụ thực sự không thuộc về bạn. Hãy suy nghĩ về nó như thế này: Là một người dùng, bạn nghĩ tôi sẽ khó chịu như thế nào nếu tôi đăng nhập vào 5 dịch vụ khác nhau bằng tài khoản Google của mình, sau đó lần đầu tiên đăng xuất khỏi một trong số chúng, tôi phải đăng nhập vào tài khoản Gmail của mình một lần nữa vì nhà phát triển ứng dụng đó đã quyết định rằng, khi tôi đăng xuất khỏi ứng dụng của anh ấy, tôi cũng nên đăng xuất khỏi Google? Nó sẽ già đi rất nhanh. Tóm lại, bạn thực sự không muốn làm điều này ...

Yeh yeh, bất cứ điều gì, tôi vẫn muốn đăng xuất người dùng khỏi Google, chỉ cần cho tôi biết tôi làm điều này như thế nào?

Như đã nói, nếu bạn vẫn muốn đăng xuất một người dùng khỏi Google và nhận ra rằng bạn rất có thể đang làm gián đoạn quy trình làm việc của họ, bạn có thể tạo động url đăng xuất từ ​​một trong các nút đăng xuất các dịch vụ của Google của họ và sau đó gọi nó bằng cách sử dụng một phần tử img hoặc một thẻ script:

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

HOẶC LÀ

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

HOẶC LÀ

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

Nếu bạn chuyển hướng người dùng của mình đến trang đăng xuất hoặc gọi nó từ một phần tử không bị giới hạn tên miền chéo, người dùng sẽ bị đăng xuất khỏi Google.

Lưu ý rằng điều này không nhất thiết có nghĩa là người dùng sẽ đăng xuất khỏi ứng dụng của bạn , chỉ Google. :)

Tóm lược:

Điều quan trọng bạn cần ghi nhớ là khi đăng xuất khỏi ứng dụng của mình, bạn không cần yêu cầu người dùng nhập lại mật khẩu. Đó là toàn bộ vấn đề! Nó xác thực dựa trên Google để người dùng không phải nhập mật khẩu của mình lặp đi lặp lại trong mỗi ứng dụng web mà họ sử dụng. Phải mất một số thời gian để làm quen, nhưng hãy biết rằng, miễn là người dùng đăng nhập vào Google, ứng dụng của bạn không cần phải lo lắng về việc người dùng có phải là người mà họ nói hay không.

Tôi có cùng triển khai trong một dự án như bạn, sử dụng thông tin Tiểu sử trên Google với OAuth. Tôi đã thử điều tương tự mà bạn đang muốn thử và nó thực sự bắt đầu khiến mọi người tức giận khi họ phải đăng nhập vào Google nhiều lần, vì vậy chúng tôi đã ngừng đăng xuất họ khỏi Google. :)


8
Cảm ơn bạn vì thời gian quý báu của bạn và một mô tả lớn như vậy. Nhưng khách hàng của tôi có ý kiến ​​khác. Giả sử người dùng đăng nhập vào ứng dụng bằng thông tin đăng nhập google của mình từ một hệ thống công cộng và đăng xuất khỏi ứng dụng. Anh ta có thể nghĩ rằng anh ta cũng đã đăng xuất khỏi google nhưng thực ra không phải! Bất kỳ người dùng nào khác sử dụng hệ thống sau này sẽ có quyền truy cập vào tài khoản google.
Vinesh EG 16/10/12

12
Sau đó, người dùng của bạn cũng cần đăng xuất khỏi Google. Vấn đề là họ đang đăng nhập vào 2 dịch vụ. Người dùng của bạn cần học cách sử dụng OAuth. :) Tôi khuyên bạn nên giáo dục khách hàng của bạn và người dùng. Nếu bạn phải làm, hãy tiếp tục và cho họ xem. Sẽ không mất nhiều thời gian để thực hiện và sau đó hoàn tác sau khi bạn nhận ra nó tệ đến mức nào. :) Tôi đã không tin điều đó cho đến khi tôi thực sự làm điều này và thấy mức độ PITA phải đăng nhập lại vào Google mỗi lần tôi đăng xuất khỏi LoopToDo. Cân nhắc có thể là một thông báo "Bạn đã đăng xuất khỏi ứng dụng tuyệt vời của Vinesh, đừng quên> đăng xuất khỏi Google nữa <!"
jmort253,

1
@ jmort253 Vâng, tôi hiểu rằng họ không cần cung cấp quyền nữa, nhưng tôi nên xác thực lại bằng cách nào? Vui lòng xem câu hỏi này mà tôi đã đưa ra (tôi vẫn chưa quen với OAuth): stackoverflow.com/questions/37515836/…
Apoorv Kansal,

1
@ jmort253 Tuy nhiên, điều gì sẽ xảy ra nếu đối với người dùng từ "ngắt kết nối" ngụ ý hoàn toàn đăng xuất khỏi ứng dụng .. Vì nó tự động đăng nhập lại mà không cần nhập lại thông tin đăng nhập, có 2 vấn đề; người dùng tự hỏi điều gì xảy ra mà tôi vừa ngắt kết nối và nó sẽ không có thông tin của tôi và người dùng thứ hai sẽ không thể đăng nhập vào một tài khoản khác vì nó sẽ luôn tự động đăng nhập trừ khi nhà cung cấp xác thực cung cấp phương thức buộc đăng nhập. Vì vậy, trong trường hợp này, mong muốn đăng xuất để nó có thể làm mất hiệu lực các cookie và bạn không còn phải lo lắng về cách quản lý của nó ở phía khách hàng.
dámwreck

1
Điều này rất hữu ích cho các ứng dụng Electron, nơi người dùng đã đăng nhập bằng Google! Trong trường hợp này, đăng xuất họ khỏi Google sẽ đăng xuất họ khỏi một ứng dụng duy nhất (ứng dụng Electron).
trusktr

21

Bạn có thể đăng xuất và truy cập lại vào trang web của mình:

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
Cuối cùng! Cảm ơn bạn! Tôi đã cố gắng cả ngày để tìm cách đăng xuất, để ngăn người dùng tiếp theo đăng nhập với tư cách người dùng trước chỉ bằng một cú nhấp chuột, mà không cần biết email hoặc mật khẩu ...
một số

1
Nó không làm việc, bởi vì nó là đủ để mở cùng một trang trong một tab khác, và bạn đã đăng nhập một lần nữa ...
Bartłomiej Semańczyk

5

Đối với tôi, nó hoạt động (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
}

Bạn phải gọi hàm này trong AsyncTask trong android


2
Mặc dù đúng là điều này sẽ hoạt động, nhưng câu hỏi thực sự là hỏi về JavaScript, không phải Java.
jmort253

2
Điều đó nghe có vẻ kỳ lạ rằng tất cả những gì bạn cần là một mã thông báo, bạn có thể thô bạo buộc google buộc đăng xuất tất cả mọi người.
Archimedes Trajano

Nó sẽ không đăng xuất bạn khỏi thiết bị, nó sẽ chỉ đăng xuất ứng dụng (trong Android).
Vinoj John Hosan

2
Từ việc xem xét một số tài liệu google oauth2, mã thông báo truy cập điển hình trông như thế này. "1 / fFAGRNJru1FTz70BzhT3Zg" Giả sử phần "1 /" chỉ để con người xác định số dễ dàng hơn. Bạn vẫn có hai bảng chữ cái (viết hoa và viết thường) cộng với mười chữ số với độ dài 22 ký tự. Đó là 22 ^ (26 * 2 + 10) bằng 1.6990502e + 83. Hoặc về số lượng nguyên tử trong vũ trụ đã biết . Chúc may mắn khi ép buộc điều đó qua HTTP. ;)
Chris Balogh

Điều này dường như không thu hồi mã thông báo làm mới, có thể bị đánh cắp trước khi xóa cookie (nếu nó được lưu trữ ở đó).
Ondrej Galbavý


1

Điều này có tác dụng đăng xuất người dùng khỏi ứng dụng, nhưng không đăng xuất khỏi Google.

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

Nguồn: https://developers.google.com/identity/sign-in/web/sign-in


1
điều này sẽ không hoàn toàn đăng xuất người dùng khỏi tài khoản google của họ. Nó chỉ phá hủy cái AuthInstancemà bạn đã sử dụng. Bạn nguồn tự nói ... " Bạn có thể cho phép người dùng đăng xuất khỏi các ứng dụng của bạn mà không cần đăng khỏi Google ... "
Roshana Pitigala

@RoshanaPitigala đã cập nhật câu trả lời để chỉ định. Câu trả lời này là câu trả lời cho tiêu đề của câu hỏi, nhưng khi bạn đọc câu hỏi chi tiết hơn, bạn hiểu rằng tiêu đề đã được viết sai. Câu trả lời này phù hợp với bất kỳ ai đã thực hiện nó ở đây theo tiêu đề của câu hỏi.
CamHart

1

Ouath chỉ làm cho bản sao của Google là vô hiệu, do đó, bạn không thể sử dụng Google. Bây giờ đó là cách kiến ​​trúc được tạo ra. Đăng xuất khỏi Google, nếu bạn Đăng xuất khỏi ứng dụng của mình là một công việc bẩn thỉu, nhưng không thể giúp gì nếu yêu cầu quy định như vậy. Do đó, hãy thêm phần sau vào hàm signOut () của bạn. Dự án của tôi là một ứng dụng Angular 6:

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

Đây là localhost: 4200 là URL của ứng dụng của tôi. Nếu trang đăng nhập của bạn là xyz.com thì hãy nhập vào.


1

mã này sẽ hoạt động để đăng xuất

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

1

Để chỉ đăng xuất khỏi ứng dụng chứ không phải 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.');
            });
        });
    });

Tôi đang sử dụng ở trên trong mã ReactJs của mình.


0

Tôi hy vọng chúng ta có thể đạt được điều này bằng cách lưu trữ mã thông báo trong phiên trong khi đăng nhập và truy cập mã thông báo khi anh ấy nhấp vào đăng xuất.

    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

Có vẻ như Google gần đây đã phá vỡ điều gì đó với nội dung thu hồi của họ (nó đã bắt đầu trả lại 400 lỗi cho chúng tôi). Bây giờ bạn phải gọi

auth2.disconnect ();

Trong trường hợp của chúng tôi, sau đó chúng tôi phải đợi vài giây để cuộc gọi ngắt kết nối hoàn tất, nếu không mã đăng nhập sẽ ủy quyền lại trước khi hoàn tất. Sẽ rất tốt nếu google trả về một lời hứa từ phương pháp ngắt kết nối.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.