Google로 로그인하기 위해 OAuth2를 사용한 애플리케이션에서 로그 아웃하는 방법은 무엇입니까?


84

내 응용 프로그램에서 jsapi를 사용하여 Google 사인 아웃을 구현했습니다.

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했지만 작동하지 않는 것 같습니다.

답변:


243

OAuth 개요 : 사용자가 누구라고 말하는가? :

"Google로 로그인"옵션과 같이 OAuth를 사용하여 Stack Overflow에 로그인했는지 확실하지 않지만이 기능을 사용할 때 Stack Overflow는 단순히 Google에 귀하가 누구인지 알고 있는지 묻는 것입니다.

"Yo Google, Vinesh 친구가 vinesh.e@gmail.com이 자신이라고 주장합니다. 사실인가요?"

이미 로그인되어있는 경우 Google에서 예라고 말합니다. 그렇지 않은 경우 Google은 다음과 같이 말합니다.

"잠시만 기다려주세요.이 친구를 인증하겠습니다. Google 계정에 올바른 비밀번호를 입력 할 수 있다면 바로 그 사람입니다."

Google 비밀번호를 입력하면 Google은 사용자가 누구인지를 Stack Overflow에 알리고 Stack Overflow가 로그인합니다.

앱에서 로그 아웃하면 로그 아웃하고 당신의 응용 프로그램 :

여기에서 OAuth를 처음 접하는 개발자가 가끔 혼란스러워하는 경우가 있습니다. Google과 Stack Overflow, Assembla, Vinesh's-very-cool-slick-webapp은 모두 다른 엔티티이며 Google은 Vinesh의 멋진 웹앱에서 귀하의 계정에 대해 아무것도 모릅니다. 프로필 정보에 액세스하는 데 사용하는 API를 통해 노출되는 것 외에는 마찬가지입니다.

사용자가 로그 아웃하면 사용자는 Google에서 로그 아웃하지 않고 앱, Stack Overflow, Assembla 또는 Google OAuth를 사용하여 사용자를 인증하는 모든 웹 애플리케이션에서 로그 아웃합니다.

실제로 모든 Google 계정에서 로그 아웃해도 여전히 Stack Overflow에 로그인되어 있습니다. 앱에서 사용자가 누구인지 알게되면 해당 사용자는 Google에서 로그 아웃 할 수 있습니다. Google은 더 이상 필요하지 않습니다.

즉, 실제로 귀하에게 속하지 않는 서비스에서 사용자를 로그 아웃하는 것입니다. 다음과 같이 생각해보십시오. 사용자로서 Google 계정으로 5 개의 다른 서비스에 로그인 한 다음 그중 하나에서 처음 로그 아웃 할 때 Gmail 계정에 로그인해야합니다. 다시 그 앱 개발자가 그의 애플리케이션에서 로그 아웃 할 때 Google에서도 로그 아웃해야한다고 결정했기 때문입니다. 그것은 정말 빨리 늙어 갈 것입니다. 요컨대, 당신은 정말로 이것을하고 싶지 않습니다 ...

Yeh yeh, 어쨌든, 여전히 사용자를 Google에서 로그 아웃하고 싶습니다. 어떻게해야하는지 알려주세요.

당신이 경우 말했다, 함께 아직도 구글의 아웃 사용자가 로그, 당신은 아주 잘 그들의 작업 흐름을 방해 할 수 있다는 것을 인식 할, 당신은 동적으로 Google 서비스 중 하나에서 로그 아웃 URL을 만들 수 버튼을 로그 아웃 한 후 사용하여 호출 있음 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에 로그인되어있는 한 앱은 사용자가 자신이 말하는 사람인지 아닌지에 대해 걱정할 필요가 없습니다.

OAuth와 함께 Google 프로필 정보를 사용하여 프로젝트에 동일한 구현이 있습니다. 나는 당신이 시도하려는 것과 똑같은 것을 시도했고, 사람들이 계속해서 구글에 로그인해야 할 때 화를 내기 시작했고, 그래서 우리는 그들을 구글에서 로그 아웃하는 것을 중단했습니다. :)


8
귀중한 시간과 큰 설명에 감사드립니다. 하지만 제 의뢰인은 다른 의견을 가지고 있습니다. 사용자가 공용 시스템에서 Google 로그인을 사용하여 애플리케이션에 로그인하고 애플리케이션에서 로그 아웃했다고 가정합니다. 그는 그가 Google에서도 로그 아웃했다고 생각할 수 있지만 실제로는 그렇지 않습니다! 나중에 시스템을 사용하는 다른 사용자는 Google 계정에 액세스 할 수 있습니다.
Vinesh EG

12
그런 다음 사용자도 Google에서 로그 아웃해야합니다. 요점은 두 서비스에 로그인하고 있다는 것입니다. 사용자는 OAuth 사용 방법을 배워야합니다. :) 나는 당신의 클라이언트와 사용자를 교육하는 것이 좋습니다. 필요한 경우 계속해서 보여주세요. 구현하는 데 오래 걸리지 않고 나중에 얼마나 짜증나는지 알게되면 실행 취소합니다. :) 실제로 이것을하고 LoopToDo에서 로그 아웃 할 때마다 Google에 다시 로그인해야하는 PITA의 양을 알기 전까지는 믿지 않았습니다. "Vinesh의 멋진 앱에서 로그 아웃했습니다.> Google에서도 로그 아웃 <!"하는 것을 잊지 마세요.
jmort253

1
@ jmort253 예, 더 이상 권한을 제공 할 필요가 없다는 것을 알고 있지만 어떻게 다시 인증해야합니까? 내가 만든이 질문을 참조하십시오 (아직 OAuth를 처음 사용합니다) : stackoverflow.com/questions/37515836/…
Apoorv Kansal

1
@ jmort253 그러나 사용자에게 "연결 끊기"라는 단어가 응용 프로그램의 전체 로그 아웃을 의미하면 어떻게됩니까? 자격 증명을 다시 입력하지 않고 자동으로 다시 로그인되기 때문에 두 가지 문제가 있습니다. 사용자는 내가 방금 연결을 끊고 내 정보가 없어야하고 인증 공급자가 강제 로그인 방법을 제공하지 않는 한 항상 자동 로그인되기 때문에 두 번째 사용자는 다른 계정에 로그인 할 수 없습니다. 따라서이 경우 쿠키를 무효화하고 더 이상 클라이언트 측에서 쿠키를 관리하는 방법에 대해 걱정할 필요가 없도록 로그 아웃하는 것이 바람직합니다.
darewreck

1
이것은 사용자가 Google로 로그인 한 Electron 애플리케이션에 유용합니다! 이 경우 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
드디어! 감사합니다! 다음 사용자가 이메일이나 비밀번호를 모르고 클릭 한 번으로 이전 사용자로 로그인하는 것을 방지하기 위해 로그 아웃하는 방법을 찾기 위해 하루 종일 노력해 왔습니다.
some

1
또 다른 탭에 동일한 페이지를 열 충분 때문에, 작품을 나던, 당신은 ... 다시 로그인
Bartłomiej Semańczyk

5

나를 위해 작동합니다 (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에서이 함수를 호출해야합니다.


2
이것이 작동하는 것은 사실이지만, 질문은 실제로 Java가 아닌 JavaScript에 대해 묻는 것입니다.
jmort253 2014 년

2
그것은 당신이 필요로하는 모든 것이 토큰이라는 이상하게 들립니다 .Google이 모든 사람을 강제로 로그 아웃하도록 무차별 대입 할 수 있습니다.
Archimedes Trajano 2014

기기에서 로그 아웃하지 않고 애플리케이션 (Android) 만 로그 아웃합니다.
Vinoj John Hosan 2014

2
일부 Google oauth2 문서를 살펴보면 일반적인 액세스 토큰은 다음과 같습니다. "1 / fFAGRNJru1FTz70BzhT3Zg" "1 /"부분이 인간이 번호를 쉽게 식별 할 수 있도록한다고 가정합니다. 여전히 2 개의 알파벳 (대문자 및 소문자)과 22 자 길이의 10 자리 숫자가 있습니다. 이는 1.6990502e + 83과 같은 22 ^ (26 * 2 + 10)입니다. 또는 알려진 우주의 원자 수에 대해 . HTTP를 통해 강제로 강제하는 행운을 빕니다. ;)
Chris Balogh

이것은 쿠키를 제거하기 전에 훔칠 수있는 새로 고침 토큰을 취소하지 않는 것 같습니다 (저장된 경우).
Ondrej Galbavý


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당신이 사용한 것만 파괴합니다 . 귀하의 소스 자체가 ... "라고 당신은 할 수 있도록 할 수 있습니다 구글의 로그 아웃하지 않고 앱에서 로그 아웃 ... "
Roshana Pitigala

@RoshanaPitigala가 답변을 업데이트했습니다. 이 답변은 질문 제목에 대한 답변이지만 질문을 더 자세히 읽으면 제목이 잘못 작성되었음을 이해하게됩니다. 이 답변은 질문 제목에 따라 여기에 만든 모든 사람에게 적용됩니다.
CamHart

1

Ouath는 Google 인스턴스를 null로 만들므로 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

이 코드는 로그 아웃 할 수 있습니다.

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

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이 disconnect 메서드에서 promise를 반환하면 좋을 것입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.