이 문서에서는 Flash 또는 Silverlight 애플리케이션에서 Google의 AuthSub 인증 시스템을 사용하는 방법을 설명합니다.
참고: Google의 웹 기반 애플리케이션용 계정 인증 서비스인 AuthSub에 대해 잘 알고 있다면 ActionScript용 AuthSub가 개념적으로 매우 유사하다는 것을 알 수 있습니다. 기본 구현은 다르지만 클라이언트 애플리케이션 개발자에게는 차이가 중요하지 않습니다. 일부 문서에서는 구분이 중요하지 않은 맥락에서 ActionScript용 AuthSub를 간단히 'AuthSub'라고 지칭합니다.
ActionScript용 AuthSub 인터페이스를 사용하면 Flash 또는 Silverlight 애플리케이션이 사용자를 대신하여 보호된 Google Data API 피드를 인증할 수 있습니다. 높은 수준의 보안을 유지하기 위해 인터페이스를 사용하면 애플리케이션이 사용자의 계정 로그인 정보를 처리하지 않고도 인증 토큰을 가져올 수 있습니다.
ActionScript용 AuthSub는 JavaScript용 AuthSub의 변형입니다. JavaScript용 AuthSub와 마찬가지로 Google 도메인이 아닌 도메인에 호스팅된 웹페이지에서 클라이언트 애플리케이션을 인증하는 교차 도메인 방법을 제공합니다. 인증 서비스가 다른 도메인 (www.google.com 대신 accounts.googleapis.com)에 있고 외부 사이트에서 해당 도메인에 액세스할 수 있도록 하는 crossdomain.xml 파일을 제공한다는 점에서 표준 AuthSub와 다릅니다.
모든 인증 서비스 API 사용에 관한 논의는 Google 계정 API 그룹도 참고하세요.
잠재고객
이 문서는 Google 서비스에 액세스하는 Flash 또는 Silverlight 웹 애플리케이션을 개발하는 프로그래머를 대상으로 합니다.
이 문서에서는 사용자가 Google Data API 프로토콜 및 AuthSub 인터페이스의 일반적인 개념을 이해하고 있다고 가정합니다. 또한 ActionScript로 프로그래밍하는 방법을 알고 있다고 가정합니다.
지원되는 환경
ActionScript용 AuthSub는 현재 Firefox 1.5 이상 및 Internet Explorer 6.0 이상에서 Flash 9.0 이상 또는 Silverlight 2.0 이상과 함께 지원됩니다.
ActionScript용 AuthSub 작동 방식
웹 애플리케이션, Google 인증 서비스, Google 데이터 서비스 간의 통신 작동 방식을 간략하게 요약하면 다음과 같습니다.
- 사용자를 대신하여 Google 데이터 서비스에 액세스하려면 웹 애플리케이션에 유효한 인증 토큰이 있어야 합니다. 일반적으로 애플리케이션은 이 토큰을 쿠키에 저장합니다. 이러한 쿠키가 없으면 웹 애플리케이션은 AuthSub를 통해 토큰을 획득해야 합니다. 토큰을 획득하기 위해 웹 애플리케이션은 액세스할 서비스를 지정하여 인증 서비스에 대한 ActionScript 로그인 호출에 AuthSub를 만듭니다.
- 웹 애플리케이션에서 요청을 받으면 인증 서비스는 사용자를 '액세스 요청' 페이지로 리디렉션합니다. 이 페이지에서는 사용자에게 Google 계정에 로그인하라는 메시지를 표시하고 Google 서비스에 대한 액세스를 허용하거나 거부하도록 요청합니다.
- 사용자가 웹 애플리케이션에 대한 액세스 권한을 부여할지 거부할지 결정합니다. 사용자가 액세스를 거부하면 웹 애플리케이션으로 다시 이동하는 대신 Google 페이지로 이동합니다.
- 사용자가 성공적으로 로그인하고 액세스 권한을 부여하면 인증 서비스는 사용자를 원래 호출을 수행한 웹 애플리케이션 URL로 다시 리디렉션합니다. 리디렉션은 쿼리 매개변수를 통해 지정된 서비스의 인증 토큰을 전달합니다. 애플리케이션은 토큰을 웹 애플리케이션의 도메인 아래 사용자 브라우저에 쿠키로 저장해야 합니다. 토큰은 취소될 때까지 유효합니다. (토큰 취소 시기에 관한 도움말은 토큰 정보 섹션을 참고하세요.)
- 웹 애플리케이션은 Google 데이터 서비스에 연락하여 서비스에 전송되는 각 요청과 함께 인증 토큰을 전송합니다.
- Google 데이터 서비스가 토큰을 인식하면 요청된 데이터를 제공합니다.
ActionScript 인터페이스용 AuthSub 사용
ActionScript용 AuthSub 또는 AuthSubAS는 Google Data API를 사용하는 Flash (또는 Silverlight) 애플리케이션을 위한 교차 도메인 AuthSub 엔드포인트를 제공합니다.
AuthSubAS는 google.com에 있는 AuthSub 엔드포인트의 미러를 제공하며, Flash (또는 Silverlight)가 이러한 엔드포인트에 액세스할 수 있도록 하는 추가 crossdomain.xml 파일이 있습니다. 예를 들어 https://accounts.googleapis.com/accounts/AuthSubSessionToken에 액세스하여 AuthSubSessionToken 엔드포인트를 사용할 수 있습니다.
다음 단계에서는 인증 토큰을 가져와 Flash 애플리케이션에서 Google 서비스에 액세스하는 과정을 안내합니다.
- 교차 도메인 정책을 설정합니다.
크로스 도메인 방식으로 Flash를 사용하려면 액세스할 각 외부 도메인의 정책으로 초기화해야 합니다. 이렇게 하려면 다음과 같이 각 도메인에 ActionScript 메서드
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(예시에서 나중에 액세스하는 PicasaWeb)의 정책을 로드합니다. - 일회용 토큰을 요청합니다.
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');
이 메서드에는 범위 값이 필요합니다. 각 Google 서비스는 허용하는 액세스 범위를 정의하며 토큰 요청에서 해당 범위를 참조해야 합니다. 사용할 범위 값을 확인하려면 액세스하려는 Google 서비스의 문서를 확인하세요. 범위는 URL과 비슷합니다. 서비스를 식별하는 간단한 URL일 수도 있고 읽기 전용 액세스를 제한하는 등 더 제한적인 액세스를 지정할 수도 있습니다. 서비스에서 범위를 선택할 수 있는 경우 가능한 가장 엄격한 범위의 토큰을 요청하세요. 예를 들어 Google Calendar의 데이터 피드에 액세스하려면
'http://www.google.com/calendar'이 아닌'http://www.google.com/calendar/feeds'범위를 사용합니다.도움말:
- 사용자가 로그인 프로세스를 수동으로 시작하도록 로그인 버튼이나 기타 사용자 입력 메커니즘을 제공하는 것이 좋습니다. 사용자 상호작용을 기다리지 않고 로드 후 즉시 확인하고 리디렉션하면 사용자가 페이지에 도착했을 때 가장 먼저 표시되는 것은 Google 로그인 페이지입니다. 사용자가 로그인하지 않기로 결정하면 Google은 사용자를 다시 페이지로 안내하지 않습니다. 따라서 사용자의 관점에서 사용자는 페이지를 방문하려고 했지만 다시 돌아가지 않았습니다. 이 시나리오로 인해 사용자가 혼란스럽고 불만을 느낄 수 있습니다.
- 사용자를 위해 두 개 이상의 Google 서비스에 액세스해야 하는 애플리케이션은 각 새 서비스에 대해 새 토큰을 요청해야 합니다 (각 서비스의 범위가 다르기 때문).
- 인증 토큰을 요청합니다.
AuthSubRequest엔드포인트는 사용자 브라우저의 URL을http://yourWebAppUrl?token=singleUseToken로 설정하여 일회용 토큰을 애플리케이션에 반환합니다. 애플리케이션이 일회용 토큰을 수신하면 토큰을 다회용 (장기) 토큰으로 교환해야 하며, 이 토큰은 Google 데이터 피드에 대한 요청을 만드는 데 사용할 수 있습니다. 이렇게 하려면 일회용 토큰으로AuthSubSessionToken메서드를 호출합니다.애플리케이션이 로드될 때 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 확인 페이지를 방문하지 않아도 됩니다.
- 인증 토큰 사용
인증 토큰을 사용하려면 Google 서비스에 대한 요청에
Authorization헤더를 통해 연결하세요.Authorization: AuthSub token="(session token goes here)"
포토 서비스의 ActionScript 예:
// 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'));
로그아웃 버튼이나 클릭 가능한 링크와 같은 수동 로그아웃 기능을 제공하는 것이 좋습니다. 이 접근 방식을 사용하면 사용자가 원하는 경우 로그아웃하거나 로그인 상태를 유지하여 다음에 애플리케이션에 액세스할 때 데이터 피드를 편리하게 사용할 수 있습니다.
토큰 정보
이 섹션에서는 ActionScript용 AuthSub에서 사용되는 토큰을 설명합니다. 대부분의 컨텍스트에서는 이 정보를 알 필요가 없습니다.
각 인증 토큰은 다음 데이터에 따라 다릅니다.
- Google 서비스 범위
- 사용자의 Google 계정
- 클라이언트 애플리케이션
토큰 데이터를 사용하면 지정된 서드 파티 애플리케이션만 데이터를 요청할 수 있으며 요청이 지정된 범위 및 사용자 계정의 데이터로 제한됩니다.
이 범위, 사용자, 클라이언트 조합의 토큰은 한 번에 하나만 유효할 수 있습니다. 웹 애플리케이션은 특정 사용자의 새로운 Google 서비스에 액세스해야 할 때마다 새로운 토큰을 요청해야 합니다. 토큰으로 제공되는 액세스 범위는 Google 서비스에 따라 다르며, 읽기 전용 액세스와 같은 특정 유형의 데이터 또는 활동에 대한 액세스를 제한할 수 있습니다.
ActionScript 인터페이스용 AuthSub에서 반환된 토큰은 취소될 때까지 필요한 만큼 여러 번 사용할 수 있습니다. 토큰의 수명은 애플리케이션에서 관리하며, 보안과 편의성 간의 균형을 유지해야 합니다. 새 세션이 시작될 때마다 새 토큰을 요청하는 것이 좋습니다.
일부 Google 서비스에서는 등록되어 있고 보안 토큰을 사용하는 웹 애플리케이션만 액세스를 허용할 수 있습니다. 이러한 서비스에는 ActionScript용 AuthSub가 지원되지 않습니다. 보안 토큰을 사용하려면 조직에서 Google에 SSL 인증서를 등록하고 해당 데이터 피드의 모든 요청에 서명해야 합니다.