액션스크립트에서 AuthSub 사용

이 문서에서는 Flash 또는 Silverlight 애플리케이션에서 Google AuthSub 인증 시스템을 사용하는 방법을 설명합니다.

참고: Google의 웹 기반 애플리케이션용 계정 인증 서비스인 AuthSub에 이미 익숙하다면 액션스크립트용 AuthSub가 개념적으로 매우 유사하다는 것을 알 수 있습니다. 기본 구현은 서로 다르지만, 클라이언트 애플리케이션 개발자에게는 차이가 없습니다. 일부 문서에서 구분이 관련 없는 경우 액션스크립트용 AuthSub를 줄여서 'AuthSub'라고 합니다.

액션스크립트용 AuthSub 인터페이스를 사용하면 사용자 대신 Flash 또는 Silverlight 애플리케이션에서 보호된 Google Data API 피드에 인증할 수 있습니다. 높은 수준의 보안을 유지하기 위해 인터페이스를 사용하면 애플리케이션에서 사용자 계정 로그인 정보를 처리하지 않고도 인증 토큰을 가져올 수 있습니다.

액션스크립트용 AuthSub는 자바스크립트용 AuthSub의 변형입니다. 자바스크립트용 AuthSub와 마찬가지로 클라이언트 애플리케이션이 Google 이외의 도메인에서 호스팅되는 웹페이지에서 인증하기 위한 교차 도메인 방법을 제공합니다. 인증 서비스가 다른 도메인 (www.google.com이 아니라 accounts.googleapis.com)에 있으며 외부 사이트에서 해당 도메인에 액세스할 수 있는 crossdomain.xml 파일을 제공한다는 점에서 표준 AuthSub와 다릅니다.

모든 인증 서비스 API 사용에 대한 설명은 Google Accounts API 그룹을 참고하세요.

대상

이 문서는 Google 서비스에 액세스하는 Flash 또는 Silverlight 웹 애플리케이션을 개발하는 프로그래머를 대상으로 합니다.

이 문서에서는 사용자가 Google Data API 프로토콜AuthSub 인터페이스에 관한 일반적인 개념을 이해하고 있다고 가정합니다. 또한 사용자가 액션스크립트로 프로그래밍하는 방법을 알고 있다고 가정합니다.

지원되는 환경

액션스크립트용 AuthSub는 현재 Firefox 1.5 이상, Internet Explorer 6.0 이상, Flash 9.0 이상 또는 Silverlight 2.0 이상에서 지원됩니다.

액션스크립트용 AuthSub 작동 방식

다음은 웹 애플리케이션, Google 인증 서비스 및 Google 데이터 서비스 간의 통신 방식에 대한 요약입니다.

  1. 사용자를 대신하여 Google 데이터 서비스에 액세스하려면 웹 애플리케이션에 유효한 인증 토큰이 있어야 합니다. 일반적으로 애플리케이션은 이 토큰을 쿠키에 저장합니다. 쿠키가 존재하지 않으면 웹 애플리케이션이 AuthSub를 통해 토큰을 획득해야 합니다. 토큰을 얻기 위해 웹 애플리케이션은 인증 서비스에 대한 액션스크립트 로그인에 대한 AuthSub를 호출하여 액세스할 서비스를 지정합니다.
  2. 인증 요청을 웹 애플리케이션에서 받으면 사용자가 '액세스 요청' 페이지로 리디렉션됩니다. 이 페이지는 사용자에게 Google 계정에 로그인하라는 메시지를 표시하고 Google 서비스에 대한 액세스를 부여하거나 거부하도록 요청합니다.
  3. 사용자가 웹 애플리케이션에 대한 액세스 권한을 부여할지 아니면 거부할지 결정합니다. 사용자가 액세스를 거부하면 웹 애플리케이션으로 돌아가지 않고 Google 페이지로 이동합니다.
  4. 사용자가 정상적으로 로그인하고 액세스 권한을 부여하면 인증 서비스가 사용자를 원래 호출한 웹 애플리케이션 URL로 다시 리디렉션합니다. 리디렉션은 쿼리 매개변수를 통해 지정된 서비스의 인증 토큰을 전달합니다. 애플리케이션은 사용자의 브라우저에서 웹 애플리케이션의 도메인에 토큰을 쿠키로 저장해야 합니다. 토큰은 취소될 때까지 유효합니다. 토큰을 취소하는 시기에 대한 도움말은 토큰 정보 섹션을 참조하세요.
  5. 웹 애플리케이션은 Google 데이터 서비스에 접속하여 서비스에 전송된 각 요청과 함께 인증 토큰을 보냅니다.
  6. Google 데이터 서비스에서 토큰을 인식하면 요청된 데이터를 제공합니다.

액션스크립트 인터페이스용 AuthSub 사용

액션스크립트용 AuthSub(AuthSubAS)는 Google 데이터 API를 사용하는 플래시(또는 Silverlight) 애플리케이션에 대한 교차 도메인 AuthSub 엔드포인트를 제공합니다.

AuthSubAS는 google.com에 있는 AuthSub 엔드포인트를 미러링하고 Flash (또는 Silverlight)가 이러한 엔드포인트에 액세스할 수 있도록 하는 추가 crossdomain.xml 파일을 제공합니다. 예를 들어 엔드포인트 AuthSubSessionTokenhttps://accounts.googleapis.com/accounts/AuthSubSessionToken에 액세스하여 사용할 수 있습니다.

다음 단계에서는 인증 토큰을 가져와서 Flash 애플리케이션에서 Google 서비스에 액세스하는 데 사용하는 과정을 안내합니다.

  1. 교차 도메인 정책 설정하기

    교차 도메인 방식으로 Flash를 사용하려면 액세스할 외부 도메인마다 정책을 사용하여 초기화해야 합니다. 이렇게 하려면 다음과 같이 각 도메인에 관해 액션스크립트 메서드 Security.loadPolicyFile(policy)를 호출합니다.

    <?xml version="1.0" encoding="utf-8"?>
    <Application xmlns="http://www.adobe.com/2006/mxml"
      initialize="onInitialized()"
      applicationComplete="onLoaded()">
      <Script>
        import flash.external.ExternalInterface;
        import flash.net.navigateToURL;
        import mx.controls.Alert;
    
        private function onInitialized() : void {
          // Load the cross domain policy file for each of the googleapis.com
          // domains used. At the very least, we need the ones for the API (photos,
          // in this case) and the one for AuthSub for ActionScript (accounts).
          Security.loadPolicyFile('http://photos.googleapis.com/data/crossdomain.xml');
          Security.loadPolicyFile('https://accounts.googleapis.com/crossdomain.xml');
        }
    
    

    전체 샘플 보기

    여기서는 accounts.googleapis.com(AuthSubAS) 및 photos.googleapis.com/data(이 예의 경우 나중에 액세스하는 Picasa 웹)에 대한 정책을 로드하고 있습니다.

  2. 일회용 토큰을 요청합니다.

    AuthSub 프로세스의 첫 번째 단계는 AuthSub 엔드포인트에 일회용 토큰을 요청하는 것입니다. 애플리케이션은 다음과 같이 AuthSubRequest 엔드포인트를 호출하여 호출해야 합니다.

          var getTokenPage : URLRequest = new URLRequest('https://www.google.com/accounts/AuthSubRequest');
    
          // Construct the parameters of the AuthSub request. These are the same parameters
          // as normal AuthSub, which can be found here: /accounts/docs/AuthSub.html#AuthSubRequest
          var authSubParams : URLVariables = new URLVariables();
          authSubParams['scope'] = 'http://photos.googleapis.com/data'; // photos API
          authSubParams['session'] = 1; // single-use token
          authSubParams['secure'] = 0; // non-secure apps
          authSubParams['next'] = 'photos.swf'; // The URL of this app.
    
          getTokenPage.data =  authSubParams;
          navigateToURL(getTokenPage, '_top');
    
    

    전체 샘플 보기

    이 메서드에는 scope 값이 필요합니다. 각 Google 서비스는 허용하는 액세스 범위를 정의하며, 토큰 요청에서 해당 범위를 참조해야 합니다. 사용할 범위 값을 결정하려면 액세스하려는 Google 서비스의 문서를 확인하세요. 범위는 URL과 유사하며 서비스를 식별하는 간단한 URL이거나 읽기 전용으로 액세스를 제한하는 경우와 같이 보다 제한된 액세스를 지정할 수 있습니다. 서비스에서 범위 선택을 제공하는 경우 가능한 한 가장 좁은 범위의 토큰을 요청합니다. 예를 들어 Google Calendar의 데이터 피드에 액세스하려면 'http://www.google.com/calendar'가 아닌 'http://www.google.com/calendar/feeds' 범위를 사용합니다.

    • 사용자에게 로그인 프로세스를 수동으로 시작하라는 메시지를 표시하도록 로그인 버튼이나 기타 사용자 입력 메커니즘을 제공하는 것이 좋습니다. 대신 사용자 상호작용을 기다리지 않고 로드 직후에 확인하고 리디렉션하는 경우, 사용자가 페이지에 도착하면 가장 먼저 보게 되는 것이 Google 로그인 페이지입니다. 사용자가 로그인하지 않겠다고 결정하면 Google은 페이지로 다시 연결되지 않습니다. 따라서 사용자의 관점에서는 페이지를 방문하려고 했지만 전송되지 않고 다시 전송되지 않았습니다. 이 시나리오는 사용자에게 혼란과 불편을 초래할 수 있습니다.
    • 한 사용자에 대해 둘 이상의 Google 서비스에 액세스해야 하는 애플리케이션은 서비스마다 범위가 다르므로 새 서비스마다 새 토큰을 요청해야 합니다.

  3. 인증 토큰을 요청합니다.

    AuthSubRequest 엔드포인트는 사용자 브라우저의 URL을 http://yourWebAppUrl?token=singleUseToken로 설정하여 애플리케이션에 일회용 토큰을 반환합니다. 애플리케이션에서 일회용 토큰을 받은 후에는 토큰을 여러 사용 (오래 지속되는) 토큰으로 교환해야 합니다. 그러면 Google 데이터 피드에 대해 요청을 실행하는 데 이 토큰을 사용할 수 있습니다. 이렇게 하려면 일회용 토큰으로 AuthSubSessionToken 메서드를 호출합니다.

    애플리케이션은 URL이 로드될 때 URL에서 token 매개변수를 확인해야 합니다.

        private function onLoaded() : void {
    
          // Once the application has loaded, check to see if an AuthSub token was
    // placed into the current page's URL. If it was, the user has already
    // authenticated, and we can continue to connect to the the service itself. var searchPortion : String = ExternalInterface.call('window.location.search.toString'); if (searchPortion.length > 0) { // remove the ? from the token and extract the token. searchPortion = searchPortion.substring(1); // NOTE: Real applications should parse the URL properly. if (searchPortion.indexOf('token=') == 0) { getLongLivedToken(searchPortion.substring(6)); return; } // more code ... }

    전체 샘플 보기

    토큰을 찾으면 AuthSubSessionToken 엔드포인트를 호출하는 getLongLivedToken와 같은 메서드를 호출해야 합니다.

        private function getLongLivedToken(singleUseToken : String) : void {
          // Construct a call to the AuthSub for ActionScript endpoint on accounts.googleapis.com.
          // This call will exchange the single use token given to use by AuthSub for a long-term
          // token that we can use to make requests to endpoints such as Photos.
          var getTokenRequest : URLRequest = new URLRequest('https://accounts.googleapis.com/accounts/AuthSubSessionToken');
    
          // Due to a bug in Flash, a URLRequest with a GET request will
          // not properly send headers. We therefore use POST for this and *ALL*
          // requests.
          getTokenRequest.method = URLRequestMethod.POST;
    
          // Due to a bug in Flash, a URLRequest without a valid parameter will
          // not properly send headers. We therefore add a useless parameter to
          // make this code work.
          getTokenRequest.data = new URLVariables('pleaseignore=ignore');
    
          // Add the AuthSub for ActionScript headers.
          getTokenRequest.requestHeaders.push(new URLRequestHeader('Authorization', 'AuthSub token="' + singleUseToken + '"'));
    
          // Create the loader to get the token itself. The loader will callback
          // to the following event handlers if and when the server responds.
          var getToken : URLLoader = new URLLoader();
          getToken.addEventListener(Event.COMPLETE, onGetTokenResult);
          getToken.addEventListener(SecurityErrorEvent.SECURITY_ERROR, onGetTokenFailed);
          getToken.addEventListener(IOErrorEvent.IO_ERROR, onGetTokenFailed);
    
          try {
            getToken.load(getTokenRequest);
          } catch (e : Error) {
            Alert.show('Some error occurred: ' + e);
          }
    
    

    전체 샘플 보기

    onGetTokenResult 핸들러와 같은 메서드는 반환된 토큰을 저장해야 합니다.

        private function onGetTokenResult(e : Event) : void {
          // Load the parameters from the response.
          var getToken : URLLoader = URLLoader(e.target);
          var params : URLVariables = new URLVariables(getToken.data);
    
          // Parse the session token from the result. Real applications
          // might at this point store the token in a long-term cookie so
          // that repeated usages of the application do not require this entire
          // authentication process.
          sessionToken = params.Token;
    
          // Trim the newline from the end of the session token.
          sessionToken = sessionToken.substring(0, sessionToken.length - 1);
       }
    
    

    전체 샘플 보기

    • 애플리케이션에서 장기 토큰을 쿠키에 저장하고 단기 토큰 확인 전에 토큰을 확인하는 것이 좋습니다. 이렇게 하면 사용자가 애플리케이션을 사용하려고 할 때마다 AuthSub 확인 페이지를 방문하지 않아도 됩니다.

  4. 인증 토큰 사용:

    인증 토큰을 사용하려면 Authorization 헤더를 통해 Google 서비스에 보내는 요청에 이 토큰을 첨부합니다.

    Authorization: AuthSub token="(session token goes here)"

    포토 서비스의 액션스크립트 예:

          // Prepare a request to the photos API for the private album
          // of the user.
          var albumRequest : URLRequest = new URLRequest('http://photos.googleapis.com/data/feed/api/user/default');
          albumRequest.data = new URLVariables('access=private&v=2&err=xml');
    
          // Due to a bug in Flash, a URLRequest with a GET request will
          // not properly send headers. We therefore use POST for this and *ALL*
          // requests.
          albumRequest.method = URLRequestMethod.POST;
    
          var authsubHeader : String = 'AuthSub token="' + sessionToken + '"';
    
          // Add the Authorization header which uses the session token.
          albumRequest.requestHeaders.push(new URLRequestHeader('Authorization', authsubHeader));
    
          // The X-HTTP-Method-Override header tells the Photos API to treat this request
          // as a GET request, even though it is being conducted as a POST (due to the bug
          // mentioned above). This is very important, as GData APIs will react differently
          // to different HTTP request types.
          albumRequest.requestHeaders.push(new URLRequestHeader('X-HTTP-Method-Override', 'GET'));
    
          // We expect ATOM XML to be returned.
          albumRequest.requestHeaders.push(new URLRequestHeader('Content-Type', 'application/atom+xml'));
    
    

    전체 샘플 보기

  5. 로그아웃 버튼이나 클릭 가능한 링크와 같은 수동 로그아웃 기능을 제공하는 것이 좋습니다. 이렇게 하면 사용자는 원하는 때 로그아웃하거나 로그인한 상태를 유지하여 다음에 애플리케이션에 액세스할 때 편리하게 데이터 피드를 사용할 수 있습니다.

토큰 정보

이 섹션에서는 AuthSub에서 액션스크립트에 사용하는 토큰을 설명합니다. 대부분의 경우 이 정보를 알 필요가 없습니다.

각 인증 토큰은 다음 데이터에 한정됩니다.

  • Google 서비스 범위
  • 사용자의 Google 계정
  • 클라이언트 애플리케이션

토큰 데이터는 지정된 서드 파티 애플리케이션만 데이터를 요청할 수 있고 요청이 지정된 범위 및 사용자 계정의 데이터로 제한되도록 합니다.

한 번에 하나의 범위, 사용자, 클라이언트 조합에 대한 토큰 1개만 유효할 수 있습니다. 웹 애플리케이션은 특정 사용자의 새 Google 서비스에 액세스해야 할 때마다 새 토큰을 요청해야 합니다. 토큰이 적용되는 액세스 범위는 Google 서비스에 따라 다르며, 읽기 전용 액세스와 같은 특정 유형의 데이터나 활동으로 액세스를 제한할 수 있습니다.

액션스크립트용 AuthSub 인터페이스에서 반환하는 토큰은 취소될 때까지 필요한 만큼 사용할 수 있습니다. 토큰의 수명을 관리하면서 보안과 편의성의 균형을 유지하는 것은 애플리케이션의 책임입니다. 새 세션이 시작될 때마다 새 토큰을 요청하는 것이 좋습니다.

일부 Google 서비스에서는 등록되고 보안 토큰을 사용하는 웹 애플리케이션만 액세스를 허용할 수 있습니다. 이러한 서비스에는 액션스크립트용 AuthSub가 지원되지 않습니다. 보안 토큰을 사용하려면 조직에서 Google에 SSL 인증서를 등록하고 해당 데이터 피드에 대한 모든 요청에 서명해야 합니다.

맨 위로