이 문서에서는 OAuth 기능을 사용하여 인증을 수행하는 가젯을 작성하는 방법에 대해 설명합니다. OAuth는 makeRequest()
함수와 연결하여 사용하며, makeRequest()
함수를 사용하여 원격 콘텐츠를 가져오는 데 대한 일반적인 설명은 원격 콘텐츠 가져오기를 참조하십시오.
이 문서에서는 iGoogle에서 실행하며 OAuth 프로토콜을 지원하는 웹사이트에서 사용자의 개인정보에 액세스할 수 있는 가젯을 작성하는 가장 간단한 사용 사례에 대해 주로 알아봅니다. 이 방법은 OAuth를 사용하는 단 하나의 방법이기도 합니다. 나아가 컨테이너에서 실행하는 오픈소셜 가젯에서도 이 문서에 설명된 기술을 사용하여 OAuth로 보호된 데이터에 액세스할 수 있게 됩니다. 이때 컨테이너인 iGoogle은 iGoogle에서 사용자가 추가하는 가젯이 해당 사용자에게만 표시되므로 가장 단순한 형태로 표시됩니다. 소셜 네트워킹 컨테이너에서는 가젯을 보는 사람이 가젯을 추가한 데이터 소유자와 다를 수도 있으므로 좀 더 복잡하게 표시됩니다. 서비스 제공업체에서 소셜 네트워킹 컨테이너에 OAuth를 지원하는 방법은 오픈소셜을 사용하도록 설정된 소셜 네트워크의 OAuth 사용 가젯 문서를 참조하십시오.
OAuth 프록시란 무엇인가요?
대부분의 인터넷 서비스에서는 사용자를 대신하여 해당 인터넷 서비스 저장소의 개인정보에 액세스 권한을 부여하는 REST API를 제공하기 시작했습니다. 예를 들어 인터넷 서비스에서 사용자에게 본인의 사진, 이메일, 주소록, 건강 기록 등에 대한 액세스 권한을 부여할 수 있습니다. OAuth는 표준의 하나로 개인정보의 계정 소유자가 다른 웹사이트(또는 가젯)에서의 데이터 액세스를 허용하도록 호스팅 서비스에 지정할 수 있습니다. OAuth 프록시는 가젯의 OAuth 표준을 사용하기 쉽도록 하기 위해 설계되었습니다.
참고: OAuth 프록시는 오픈소셜 컨테이너에서 실행되는 가젯의 gadgets.*
API에서만 지원됩니다. 기존 가젯의 API에서는 지원하지 않습니다. 현재 iGoogle이라는 가젯 컨테이너에서 이 기능을 지원합니다. 한편 Shindig라는 오픈소스 프로젝트를 통해 OAuth 프록시 기능뿐 아니라 가젯 명세를 구현합니다. 다른 많은 인터넷 웹사이트에서도 이 기술을 평가 및 구현하는 중입니다.
대상
이 문서는 OAuth 프로토콜을 사용하여 사용자의 서비스와 통신하려는 가젯 개발자용으로 작성되었으며, 액세스하려는 서비스에 친숙하고 액세스/인증 문제가 포함되어 있음을 알고 있다는 전제 하에 설명합니다. 가젯 인증 프록시 서비스를 사용할 때는 몇 가지 서비스 특정 세부사항을 알고 있어야 합니다.
목차
- OAuth 프록시란 무엇인가요?
- OAuth를 지원하는 REST API가 있는 인터넷 서비스는 무엇인가요?
- 주요 개념
- 서비스 제공업체 선택
- Google 서비스 제공업체
- 비 Google 서비스 제공업체
- 엔드포인트 선택
- 예제 가젯 둘러보기
- OAuth 가젯 구현
- 예제 가젯
- OAuth 섹션
- 승인 과정 구현
- makeRequest()에 대해 자세히 알아보기
- Google 데이터 API: 대안적 접근방식
- 팝업 창 건너뛰기
- 사전 승인 URL 구현
- 사용자 환경설정 추가
- 기타 예제
- 고급 OAuth 기술
OAuth를 지원하는 REST API가 있는 인터넷 서비스는 무엇인가요?
Google에서 사용 가능한 모든 REST API(웹 응용프로그램에 대한 OAuth 인증 및 Google 데이터 API 문서 참조)뿐 아니라 MySpace의 데이터 가용성 API에서 OAuth를 지원합니다. OAuth 커뮤니티 wiki에는 이외에도 OAuth 사용 API를 제공하는 서비스 제공업체가 추가로 나와 있습니다.
주요 개념
아래 표에는 기본적인 OAuth 용어에 대한 정의가 나와 있습니다. 자세한 내용은 OAuth 상세정보 및 웹 응용프로그램에 대한 OAuth 인증을 참조하십시오.
용어 | 정의 |
---|
서비스 제공업체 | OAuth를 통한 액세스를 허용하는 웹 응용프로그램입니다. 예를 들어 Google이나 MySpace입니다. |
사용자 | 서비스 제공업체에 계정을 보유한 개인으로 서비스 제공업체에 OAuth를 통해 액세스할 수 있는 데이터를 보유할 수 있습니다. 예를 들어 가젯이 OAuth를 통해 사용자의 Google 캘린더 데이터에 액세스할 수 있습니다. |
소비자 | OAuth를 사용하여 사용자 대신 서비스 제공업체에 액세스하는 웹사이트 또는 웹 응용프로그램입니다. 이런 맥락에서 OAuth를 통해 사용자의 데이터에 액세스하는 가젯은 소비자가 됩니다. |
보호된 리소스 | 서비스 제공업체에서 관리하는 데이터로 소비자(가젯)가 인증을 통해 이 데이터에 액세스할 수 있습니다. |
컨테이너 | 컨테이너란 가젯을 포함하는 오픈소셜 환경입니다. 예를 들어 iGoogle은 컨테이너입니다. 컨테이너는 가젯을 대신하여 다양한 기능을 지원할 뿐 아니라 가젯의 레이아웃 및 제어를 관리합니다. OAuth 가젯은 OAuth를 지원하는 컨테이너에서만 실행할 수 있습니다. 가젯이 OAuth를 사용하는 경우 실제로는 컨테이너에서 가젯 대신 OAuth 프로토콜에 필요한 모든 디지털 서명을 처리하여 해당 프로토콜을 실행합니다. |
소비자 키 | 가젯이 서비스 제공업체에서 해당 가젯을 식별하도록 사용하는 값으로서oauth_consumer_key 매개변수에 해당하는 값입니다. 자세한 내용은 OAuth 상세정보를 참조하십시오. |
소비자 비밀번호 | 가젯에서 소비자 키 소유권을 설정하는 데 사용하는 비밀번호입니다. |
요청 토큰 | 가젯에서 사용자의 인증을 얻을 때 사용하는 값으로서 액세스 토큰과 교환됩니다. |
액세스 토큰 | 가젯에서 사용자 대신 보호된 리소스에 액세스하는 데 사용하는 값으로서 사용자의 서비스 제공업체 자격 증명 대신 사용합니다. |
토큰 비밀번호 | 가젯에서 해당 토큰의 소유권을 설정하는 데 사용하는 비밀번호입니다. |
예를 들어 Google 데이터 API를 통해 사용자의 비공개 캘린더 데이터에 액세스하는 가젯이 있다고 합시다. 이 시나리오에서 Google은 서비스 제공업체이고 가젯은 소비자입니다. 사용자는 가젯을 사용하여 개인 캘린더 데이터에 액세스하는 사람입니다.
사용자가 처음 가젯을 실행하면 가젯은 사용자를 서비스 제공업체 사이트로 보내고 해당 사이트에서는 사용자에게 사용자의 캘린더 데이터에 액세스할 수 있는 권한을 가젯에 허용하도록 요청합니다. 이러한 인증은 OAuth를 통해 처리됩니다. 사용자가 본인의 Google 계정에 로그인하여 가젯에 권한을 부여하는 순간부터 가젯은 사용자가 명시적으로 부여한 권한을 취소하지 않는 한 계속 사용자의 캘린더 데이터에 액세스할 수 있습니다. 사용자는 로그인하여 가젯을 통해 데이터에 액세스할 수 있는 권한을 다시 부여할 필요가 없습니다.
서비스 제공업체 선택
OAuth 가젯을 만드는 첫 번째 단계는 서비스 제공업체 선택입니다. 다음과 같은 두 가지의 OAuth 사용 사례가 있습니다.
- Google Data 또는 다른 Google 서비스 제공업체의 데이터를 요청하는 경우.
- Google 이외의 서비스 제공업체의 데이터를 요청하는 경우.
옵션에 대한 자세한 내용은 다음과 같습니다.
Google 서비스 제공업체
Google 데이터 API에 액세스하는 경우에는 액세스하려는 Google 데이터 REST API 엔드포인트를 지정하기만 하면 됩니다.<ModulePrefs>
섹션의 <OAuth>
섹션과 엔드포인트에서 데이터를 요청하는 가젯의 코드에서 엔드포인트를 지정합니다.
비 Google 서비스 제공업체
비 Google 엔드포인트에 액세스할 경우 보통 비 Google 서비스 제공업체에 해당 응용프로그램을 등록해야 합니다(예: MySpace 등록 참조). 회사에서 자사의 OAuth 서비스 제공업체 엔드포인트를 노출하려 하는 경우 회사에서 작성한 가젯에 한한 경우라도 Google에서 유지 관리하는 고급 OAuth 기술 사이트 내용을 참조하시기 바랍니다.
사용자가 Google 이외의 서비스 제공업체에 응용프로그램을 등록하면 해당 서비스 제공업체는 응용프로그램에서 서비스 제공업체에 보내는 모든 요청에 디지털 서명을 하는 데 사용하는 OAuth 소비자 비밀번호를 제공합니다. 가젯은 누구나 액세스할 수 있으므로 비밀번호와 같은 유형의 정보를 저장하기에 적당하지 않습니다. 대신 가젯을 실행할 컨테이너를 제공하는 웹사이트에 OAuth 소비자 비밀번호를 등록할 수 있는데 이때 해당 웹사이트가 OAuth 프록시를 제공해야 합니다.
iGoogle의 경우 OAuth 소비자 비밀번호를 등록하려면 다음 정보를 포함한 메일을 oauthproxyreg@google.com
으로 보내면 됩니다.
- 가젯의 URL.
- 서비스 제공업체에서 사용자에게 할당한 OAuth 소비자 키. OAuth 소비자 키는 제3자 웹 응용프로그램임을 식별하는 도메인입니다. 이 도메인은 서비스 제공업체에 응용프로그램을 등록할 때 사용하는 도메인이므로 서비스 제공업체는 등록한 응용프로그램의 요청임을 식별할 수 있습니다.
- 서비스 제공업체에서 사용자에게 할당한 OAuth 소비자 비밀번호. 이 비밀번호는 응용프로그램에서 서비스 제공업체에 보내는 모든 요청에 디지털 서명을 하는 데 사용합니다.
- 서비스 제공업체와의 대칭 또는 비대칭 서명 사용 여부(또는 모른다고 할 수 있음).
OAuth 소비자 비밀번호를 등록해야만 가젯이 작동합니다. 가젯의 URL을 변경하면 해당 가젯의 비밀번호를 다시 등록해야 합니다.
대부분의 OAuth 서비스 제공업체는 OAuth 소비자 키와 소비자 비밀번호를 요청할 경우 OAuth callback URL을 입력하도록 요청합니다. 가젯에 http://oauth.gmodules.com/gadgets/oauthcallback
의 콜백 URL을 지정할 수 있습니다.
OAuth 서비스 제공업체 참고사항
개발 커뮤니티에서 이러한 직접 입력 단계를 거치지 않도록 하려면 대신 iGoogle에서 직접 디지털 서명을 승인하도록 OAuth 구성을 추가할 수 있습니다. iGoogle은 현재 OAuth 표준에 정의된 RSA_SHA1 서명 메서드와 여기에서 다양한 프로그래밍 언어로 구현된 OAuth 라이브러리로 쉽게 가져올 수 있는 자체 서명 인증서 형태로 제공하는 공개 키를 사용합니다.
-----BEGIN CERTIFICATE-----
MIIDBDCCAm2gAwIBAgIJAK8dGINfkSTHMA0GCSqGSIb3DQEBBQUAMGAxCzAJBgNV
BAYTAlVTMQswCQYDVQQIEwJDQTEWMBQGA1UEBxMNTW91bnRhaW4gVmlldzETMBEG
A1UEChMKR29vZ2xlIEluYzEXMBUGA1UEAxMOd3d3Lmdvb2dsZS5jb20wHhcNMDgx
MDA4MDEwODMyWhcNMDkxMDA4MDEwODMyWjBgMQswCQYDVQQGEwJVUzELMAkGA1UE
CBMCQ0ExFjAUBgNVBAcTDU1vdW50YWluIFZpZXcxEzARBgNVBAoTCkdvb2dsZSBJ
bmMxFzAVBgNVBAMTDnd3dy5nb29nbGUuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GN
ADCBiQKBgQDQUV7ukIfIixbokHONGMW9+ed0E9X4m99I8upPQp3iAtqIvWs7XCbA
bGqzQH1qX9Y00hrQ5RRQj8OI3tRiQs/KfzGWOdvLpIk5oXpdT58tg4FlYh5fbhIo
VoVn4GvtSjKmJFsoM8NRtEJHL1aWd++dXzkQjEsNcBXwQvfDb0YnbQIDAQABo4HF
MIHCMB0GA1UdDgQWBBSm/h1pNY91bNfW08ac9riYzs3cxzCBkgYDVR0jBIGKMIGH
gBSm/h1pNY91bNfW08ac9riYzs3cx6FkpGIwYDELMAkGA1UEBhMCVVMxCzAJBgNV
BAgTAkNBMRYwFAYDVQQHEw1Nb3VudGFpbiBWaWV3MRMwEQYDVQQKEwpHb29nbGUg
SW5jMRcwFQYDVQQDEw53d3cuZ29vZ2xlLmNvbYIJAK8dGINfkSTHMAwGA1UdEwQF
MAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAYpHTr3vQNsHHHUm4MkYcDB20a5KvcFoX
gCcYtmdyd8rh/FKeZm2me7eQCXgBfJqQ4dvVLJ4LgIQiU3R5ZDe0WbW7rJ3M9ADQ
FyQoRJP8OIMYW3BoMi0Z4E730KSLRh6kfLq4rK6vw7lkH9oynaHHWZSJLDAp17cP
j+6znWkN9/g=
-----END CERTIFICATE-----
iGoogle은 OAuth 가젯 확장 기능 초안에서 대표로 서비스 제공업체에 대한 요청을 수행할 가젯의 URL을 제공합니다.
엔드포인트 선택
엔드포인트는 가젯이 서비스 제공업체를 통해 개인정보에 액세스하는 데 사용하는 URL입니다. 사용 가능한 엔드포인트를 검색하려면 서비스 제공업체 문서를 참조하십시오. 가젯이 Google 데이터 API를 지원하는 Google 서비스를 통해 데이터를 요청하는 경우 각 서비스에서 지원하는 엔드포인트를 보려면 Google 데이터 API 문서를 참조하십시오. 일부 엔드포인트의 경우 OAuth를 통해 수행하는 인증이 필요하지만 인증이 필요하지 않은 경우도 있습니다. 다음은 Google 데이터 엔드포인트의 몇 가지 예입니다.
http://www.google.com/m8/feeds/contacts/default/full/
-- 현재 로그인한 사용자의 연락처가 들어있는 피드를 가져옵니다.http://gdata.youtube.com/feeds/api/users/default/uploads?alt=json
-- 현재 로그인한 사용자가 업로드한 YouTube 동영상을 포함한 JSON 형식의 피드를 가져옵니다.http://gdata.youtube.com/feeds/api/users/username/uploads
-- 사용자 이름에 지정된 사용자의 YouTube 동영상을 포함한 피드를 가져옵니다. 이 경우 인증이 필요하지 않습니다.
가젯은 특정 범위 내 데이터에만 액세스할 수 있습니다. 가젯이 scope=http://www.google.com/m8/feeds/
에 대한 액세스를 요청하는 경우에는 연락처 API의 엔드포인트(피드)만 사용할 수 있습니다. 하나의 가젯이 여러 개의 범위를 요청할 수 있습니다.
예제 가젯 둘러보기
이 문서에서는 간단한 가젯을 하나 예를 들어 OAuth 가젯이 어떤 식으로 작동하는지 보여줍니다. 예제 가젯은 현재 로그인한 사용자의 연락처를 가져와 표시합니다. OAuth 가젯이 어떤 식으로 작동하는지 보려면 다음 둘러보기를 따라 단계적으로 살펴봅니다.
OAuth 가젯은 gadgets.*
API를 기반으로 해야 하며 OAuth를 지원하는 오픈소셜 컨테이너 안에서 실행됩니다. iGoogle에서 OAuth 가젯을 구현할 수 있습니다.
iGoogle에 가젯을 추가하려면 다음 단계를 수행합니다.
- http://www.google.com/ig로 이동합니다.
- 해당 페이지를 원하는 대로 만들기 버튼을 클릭하여 iGoogle 디렉토리로 이동합니다.
- 왼쪽 탐색 막대 아래쪽의 피드나 가젯을 추가하세요 링크를 클릭합니다.
- 예제 가젯의 URL(http://gadget-doc-examples.googlecode.com/svn/trunk/opensocial-gadgets/oauth-contacts.xml)을 입력란에 입력한 다음 추가를 클릭합니다.
- iGoogle 홈으로 돌아가기 링크(왼쪽 상단)를 클릭하여 iGoogle로 돌아가면 예제 가젯이 표시됩니다.
새로 추가한 예제 가젯에는 '가젯을 원하는 대로 만들기'라고 표시된 링크가 나타납니다.이 링크에는 요청 토큰이 포함되어 있습니다. 데이터에 대한 액세스를 허가하려면 다음 단계를 따르세요.
- '가젯을 원하는 대로 만들기' 링크를 클릭합니다.
- 계정이 여러 개 있는 경우 Google 계정 페이지가 나타날 수 있는데 '제3자 서비스에서 사용자의 Google 계정에 액세스할 수 있는 권한을 요청하고 있습니다.'라는 메시지가 표시됩니다.액세스할 데이터를 보유한 계정을 선택합니다.
- 그러면 Google 계정 액세스 요청 페이지가 표시되며 'www.google.com 사이트에서 아래에 나열된 제품과 관련하여 Google 계정에 대한 액세스를 요청하고 있습니다.'와 같은 메세지가 표시됩니다.사이트(컨테이너)에서 액세스하려는 데이터와 관련있는 제품의 목록이 나열됩니다. 액세스 허가을 클릭합니다. 요청 토큰이 액세스 토큰과 교환되어 가젯이 지정한 서비스에서 데이터를 가져올 수 있습니다.
- iGoogle로 돌아갑니다. 이때 가젯에 데이터가 표시되어야 합니다. 자세한 내용은 승인 과정 구현을 참조하십시오.
이후에는 가젯을 삭제하거나 Google 계정으로 이동하여 액세스를 취소하지 않는 한 계속 가젯은 데이터에 액세스할 수 있습니다. 즉 1회만 액세스를 허가하면 됩니다.
예제 가젯은 사용자에게 승인 과정을 안내하기 위한 한 가지 접근방식을 보여줍니다. 특정 구현과 관계없이 가젯은 다음 작업을 수행해야 합니다.
- 사용자 데이터를 가져오려고 시도합니다.
- 가져오기에 성공하면 데이터를 표시합니다.
- 가져오지 못하면 팝업 창에 사용자가 액세스를 허용하도록 메시지를 표시합니다.
- 팝업 창이 닫히면 다시 한번 가져오기를 시작하여 사용자의 데이터를 가져옵니다. 가젯에 액세스 토큰이 연결되어 있으면 가젯을 실행할 때마다 자동으로 데이터를 가져옵니다.
Shindig 프로젝트에서는 팝업 창을 만들고 팝업 창이 닫혔는지 탐지하는 데 사용하는 자바스크립트 라이브러리를 제공합니다. 이 항목에 대한 자세한 내용은 승인 과정 구현.을 참조하십시오.
OAuth 가젯 구현
원하는 데이터를 가져올 때 사용할 엔드포인트와 서비스 제공업체를 정했으면 가젯을 구현할 준비가 되었습니다.
OAuth 가젯은 일반적인 가젯의 기능 외에도 다음 항목을 포함해야 합니다.
- 서비스 제공업체 이름.
- 엔드포인트.
- 가젯에서 사용할 서비스와 엔드포인트에 대한 세부정보를 지정하는 가젯의
<ModulePrefs>
섹션 내 <OAuth...>
섹션. - 사용자가 데이터 액세스를 승인했는지 탐지하는 메커니즘. 사용자가 아직 액세스를 허용하지 않았으면, 가젯은 예를 들어 서비스 제공업체의 OAuth 인증 URL과 연결된 링크를 사용자에게 나타내서 사용자가 서비스 제공업체로 이동하는 경로를 제공해야 합니다. 이후에는 서비스 제공업체에서 사용자에게 인증 및 승인 과정을 안내합니다. 사용자가 데이터 액세스를 승인하면 가젯은 사용자의 데이터에 액세스할 수 있습니다.
- 인증된 데이터를 가져오기 위한 올바른 OAuth 매개변수를 포함한
gadgets.* makeRequest()
함수 호출. - 반환 데이터의 처리 코드. 해당 가젯과 관련된 의미가 있습니다.
이 섹션에서는 OAuth 가젯의 작동 방식을 이해하도록 섹션별로 예제 가젯을 살펴보도록 하겠습니다.
예제 가젯
예제 가젯은 Google 주소록 데이터 API를 통해 현재 로그인한 사용자의 연락처를 가져오며, 엔드포인트(http://www.google.com/m8/feeds/contacts/default/full
)를 사용하여 요청할 자격이 있는 사용자의 연락처를 반환하도록 서버에 지시합니다. 연락처는 JSON 형식의 ATOM XML 결과(http://www.google.com/m8/feeds/contacts/default/full?alt=json
)로 반환됩니다. 자세한 내용은 Google 데이터 API와 함께 JSON 사용을 참조하십시오.
다음은 모든 요소를 갖춘 가젯으로서 자세한 내용은 다음과 같습니다.
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="OAuth Contacts" scrolling="true">
<Require feature="opensocial-0.8" />
<Require feature="locked-domain"/>
<OAuth>
<Service name="google">
<Access url="https://www.google.com/accounts/OAuthGetAccessToken" method="GET" />
<Request url="https://www.google.com/accounts/OAuthGetRequestToken?scope=http://www.google.com/m8/feeds/" method="GET" />
<Authorization url="https://www.google.com/accounts/OAuthAuthorizeToken?oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback" />
</Service>
</OAuth>
</ModulePrefs>
<Content type="html">
<![CDATA[
<!-- shindig oauth popup handling code -->
<script src="http://gadget-doc-examples.googlecode.com/svn/trunk/opensocial-gadgets/popup.js"></script>
<style>
#main {
margin: 0px;
padding: 0px;
font-size:10pt;
}
</style>
<div id="main" style="display: none">
</div>
<div id="approval" style="display: none">
<img src="http://gadget-doc-examples.googlecode.com/svn/trunk/images/new.gif">
<a href="#" id="personalize">Personalize this gadget</a>
</div>
<div id="waiting" style="display: none">
Please click
<a href="#" id="approvaldone">I've approved access</a>
once you've approved access to your data.
</div>
<script type="text/javascript">
// Display UI depending on OAuth access state of the gadget (see <divs> above).
// If user hasn't approved access to data, provide a "Personalize this gadget" link
// that contains the oauthApprovalUrl returned from makeRequest.
//
// If the user has opened the popup window but hasn't yet approved access, display
// text prompting the user to confirm that s/he approved access to data. The user
// may not ever need to click this link, if the gadget is able to automatically
// detect when the user has approved access, but showing the link gives users
// an option to fetch their data even if the automatic detection fails.
//
// When the user confirms access, the fetchData() function is invoked again to
// obtain and display the user's data.
function showOneSection(toshow) {
var sections = [ 'main', 'approval', 'waiting' ];
for (var i=0; i < sections.length; ++i) {
var s = sections[i];
var el = document.getElementById(s);
if (s === toshow) {
el.style.display = "block";
} else {
el.style.display = "none";
}
}
}
// Process returned JSON feed to display data.
function showResults(result) {
showOneSection('main');
var titleElement = document.createElement('div');
var nameNode = document.createTextNode(result.feed.title.$t);
titleElement.appendChild(nameNode);
document.getElementById("main").appendChild(titleElement);
document.getElementById("main").appendChild(document.createElement("br"));
list = result.feed.entry;
for(var i = 0; i < list.length; i++) {
entry = list[i];
var divElement = document.createElement('div');
divElement.setAttribute('class', 'name');
var valueNode = document.createTextNode(entry.gd$email[0].address);
divElement.appendChild(nameNode);
divElement.appendChild(valueNode);
document.getElementById("main").appendChild(divElement);
}
}
// Invoke makeRequest() to fetch data from the service provider endpoint.
// Depending on the results of makeRequest, decide which version of the UI
// to ask showOneSection() to display. If user has approved access to his
// or her data, display data.
// If the user hasn't approved access yet, response.oauthApprovalUrl contains a
// URL that includes a Google-supplied request token. This is presented in the
// gadget as a link that the user clicks to begin the approval process.
function fetchData() {
var params = {};
url = "http://www.google.com/m8/feeds/contacts/default/base?alt=json";
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.OAUTH;
params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] = "google";
params[gadgets.io.RequestParameters.OAUTH_USE_TOKEN] = "always";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
gadgets.io.makeRequest(url, function (response) {
if (response.oauthApprovalUrl) {
// Create the popup handler. The onOpen function is called when the user
// opens the popup window. The onClose function is called when the popup
// window is closed.
var popup = shindig.oauth.popup({
destination: response.oauthApprovalUrl,
windowOptions: null,
onOpen: function() { showOneSection('waiting'); },
onClose: function() { fetchData(); }
});
// Use the popup handler to attach onclick handlers to UI elements. The
// createOpenerOnClick() function returns an onclick handler to open the
// popup window. The createApprovedOnClick function returns an onclick
// handler that will close the popup window and attempt to fetch the user's
// data again.
var personalize = document.getElementById('personalize');
personalize.onclick = popup.createOpenerOnClick();
var approvaldone = document.getElementById('approvaldone');
approvaldone.onclick = popup.createApprovedOnClick();
showOneSection('approval');
} else if (response.data) {
showOneSection('main');
showResults(response.data);
} else {
// The response.oauthError and response.oauthErrorText values may help debug
// problems with your gadget.
var main = document.getElementById('main');
var err = document.createTextNode('OAuth error: ' +
response.oauthError + ': ' + response.oauthErrorText);
main.appendChild(err);
showOneSection('main');
}
}, params);
}
// Call fetchData() when gadget loads.
gadgets.util.registerOnLoadHandler(fetchData);
</script>
]]>
</Content>
</Module>
참고: 가젯에 <Require feature="locked-domain"/>
행을 포함하여 도메인 잠금 기능을 선택하시기 바랍니다. 또한 자체popup.js
사본을 호스팅하는 것이 좋습니다.
<OAuth> 섹션
가젯에 제일 먼저 포함해야 하는 부분은 <ModulePrefs>
섹션 내 <OAuth>
섹션입니다.
<?xml version="1.0" encoding="UTF-8" ?>
<Module>
<ModulePrefs title="OAuth Contacts" scrolling="true">
<Require feature="opensocial-0.8" />
<Require feature="locked-domain"/>
<OAuth>
<Service name="google">
<Access url="https://www.google.com/accounts/OAuthGetAccessToken" method="GET" />
<Request url="https://www.google.com/accounts/OAuthGetRequestToken?scope=http://www.google.com/m8/feeds/" method="GET" />
<Authorization url="https://www.google.com/accounts/OAuthAuthorizeToken?oauth_callback=http://oauth.gmodules.com/gadgets/oauthcallback" />
</Service>
</OAuth>
</ModulePrefs>
OAuth 섹션에서는 컨테이너에 다음과 같은 가젯의 OAuth 서비스 구성을 제공합니다.
요소 | 설명 |
---|
/ModulePrefs/OAuth/Service | 요소는 하나의 OAuth 서비스 구성입니다.
속성:
name -- 실행 시 OAuth 서비스를 참조하는 데 사용되는 서비스의 이름입니다. 매개변수는 선택사항입니다. 지정하지 않을 경우 기본값은 ""입니다. 가젯 개발자는 서비스 이름을 매개변수로 makeRequest() 함수에 전달하여 사용할 OAuth 서비스를 지정합니다.
|
/ModulePrefs/OAuth/Service/Request /ModulePrefs/OAuth/Service/Access | 이들 요소는 OAuth 요청 토큰 및 액세스 토큰 URL을 나타냅니다. 자세한 내용은 OAuth 상세정보 및 웹 응용프로그램에 대한 OAuth 인증을 참조하십시오.
속성:
url -- 엔드포인트 URL입니다.method -- 요청 시 사용할 HTTP 동사입니다. 매개변수는 선택사항입니다. 지정하지 않을 경우 기본값은 POST입니다.
|
/ModulePrefs/OAuth/Service/Authorization | OAuth 인증 URL입니다. 가젯이 사용자의 데이터에 액세스하기 위한 승인을 요청해야 하는 경우 이 URL로 이동하는 팝업 창이 열립니다. |
인증 URL에는 oauth_callback
쿼리 매개변수가 포함됩니다. OAuth 서비스 제공업체는 사용자가 데이터 액세스를 허용한 후에 이 URL로 리디렉션됩니다. 이때 http://oauth.gmodules.com/gadgets/oauthcallback
을 oauth_callback
URL로 지정합니다. oauthcallback
페이지에는 자동으로 팝업 창을 닫는 자바스크립트 짧은 코드가 포함됩니다. 가젯은 언제 팝업 창이 닫히는지 탐지하여 사용자의 데이터를 가져오려고 합니다.
승인 과정 구현
OAuth 가젯은 인증된 사용자의 데이터를 가져옵니다. 이를 위해 사용자는 이 예제의 Google Data Contacts와 같은 서비스에서 가젯과 사용자 데이터를 공유하도록 허용해야 합니다.
예를 들어 연락처 예제 가젯을 생각해 봅시다. 다음과 같은 순서로 이벤트가 발생합니다.
- 가젯을 실행하면
fetchData()
함수를 호출하는 gadgets.util.registerOnLoadHandler(fetchData)
를 호출합니다. fetchData()
함수는 makeRequest()
함수를 호출합니다.makeRequest()
함수가 callback 매개변수를 지정합니다. 콜백 매개변수는 makeRequest()
함수에서 반환한 일반적인 값 외에 몇 가지 OAuth에 해당하는 필드가 있는 자바스크립트 개체에 전달됩니다
다음은 fetchData()
함수입니다.
function fetchData() {
var params = {};
url = "http://www.google.com/m8/feeds/contacts/default/base?alt=json";
params[gadgets.io.RequestParameters.CONTENT_TYPE] = gadgets.io.ContentType.JSON;
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.OAUTH;
params[gadgets.io.RequestParameters.OAUTH_SERVICE_NAME] = "google";
params[gadgets.io.RequestParameters.OAUTH_USE_TOKEN] = "always";
params[gadgets.io.RequestParameters.METHOD] = gadgets.io.MethodType.GET;
gadgets.io.makeRequest(url, function (response) {
if (response.oauthApprovalUrl) {
// Create the popup handler. The onOpen function is called when the user
// opens the popup window. The onClose function is called when the popup
// window is closed.
var popup = shindig.oauth.popup({
destination: response.oauthApprovalUrl,
windowOptions: null,
onOpen: function() { showOneSection('waiting'); },
onClose: function() { fetchData(); }
});
// Use the popup handler to attach onclick handlers to UI elements. The
// createOpenerOnClick() function returns an onclick handler to open the
// popup window. The createApprovedOnClick function returns an onclick
// handler that will close the popup window and attempt to fetch the user's
// data again.
var personalize = document.getElementById('personalize');
personalize.onclick = popup.createOpenerOnClick();
var approvaldone = document.getElementById('approvaldone');
approvaldone.onclick = popup.createApprovedOnClick();
showOneSection('approval');
} else if (response.data) {
showOneSection('main');
showResults(response.data);
} else {
// The response.oauthError and response.oauthErrorText values may help debug
// problems with your gadget.
var main = document.getElementById('main');
var err = document.createTextNode('OAuth error: ' +
response.oauthError + ': ' + response.oauthErrorText);
main.appendChild(err);
showOneSection('main');
}
}, params);
}
가젯이 callback을 처리할 때는 response.oauthApprovalUrl
에 널(null)이 아닌 값이 있는지를 먼저 확인합니다. 사용자가 데이터에 대한 액세스를 아직 허가하지 않은 경우 response.oauthApprovalUrl
에는 사용자가 가젯에 데이터 액세스를 허용하기 위해 방문해야 하는 URL이 표시됩니다. 이때 해당 URL의 일부는 서비스 제공업체(이 경우 Google)에서 발급한 요청 토큰입니다.
가젯은 먼저 팝업 창을 관리할 shindig.oauth.popup 개체를 만듭니다. 이 shindig.oauth.popup 개체에는 다음과 같은 몇 가지 매개변수가 포함됩니다.
var popup = shindig.oauth.popup({
destination: response.oauthApprovalUrl,
windowOptions: null,
onOpen: function() { showOneSection('waiting'); },
onClose: function() { fetchData(); }
});
destination
매개변수는 팝업 창이 열리는 URL을 지정합니다 .
windowOptions
매개변수는 브라우저에서 제공한 window.open
함수에 전달할 옵션을 지정합니다. 이 옵션을 통해 팝업 창의 크기, 위치 및 색상을 제어할 수 있습니다 브라우저가 다르면 window.open
에 지원하는 매개변수도 다르므로 Internet Explorer,Firefox 등의 문서를 참조하십시오.
onOpen
함수는 사용자가 링크를 클릭하여 팝업 창을 열 때 호출됩니다. 그러면 가젯은 showOneSection('waiting')
을 호출하여 사용자의 액세스 허가를 대기하는 동안 해당 메시지를 표시합니다.
onClose
함수는 팝업 창이 닫히면 호출됩니다. 가젯은 fetchData()
호출을 등록하여 팝업 창이 닫힌 후 사용자 데이터를 가져옵니다.
팝업 개체를 만든 후에는 onclick
핸들러를 팝업 창이 열리게 만드는 DOM 요소와 연결해야 합니다. 가젯은 approval
<div>
내의 personalize
HREF가 팝업 창을 열도록 onclick
핸들러를 설정합니다.
var personalize = document.getElementById('personalize');
personalize.onclick = popup.createOpenerOnClick();
가젯은 또한 waiting <div>
의 approvaldone
HREF를 popup.createApprovedOnClick()
핸들러로 구성합니다. approvaldone
HREF를 클릭하면 가젯은 팝업 창을 닫고 사용자의 데이터를 가져오려고 시도합니다. 승인을 완료했습니다 링크를 클릭하지 않아도 된다면 좋겠지만 클릭해야 한다면 onclick
핸들러를 다음과 같이 연결해야 합니다.
var approvaldone = document.getElementById('approvaldone');
approvaldone.onclick = popup.createApprovedOnClick();
가젯에 사용자가 링크를 클릭하여 팝업 창을 열도록 요청하는 approval <div>
가 표시됩니다. 대부분의 브라우저에서는 팝업 차단기를 사용하여 불필요한 팝업 창이 나타나지 않도록 합니다. 팝업 차단기에서 차단되지 않도록 하려면 사용자가 버튼이나 링크를 클릭한 다음 가젯이 팝업 창을 열어야 합니다.
showOneSection('approval');
가젯은 <div>
와 showOneSection()
함수를 사용하여 가젯의 승인 상태에 따른 UI를 표시합니다. 다음과 같은 3개의 <div>
가 있는데 각각 가능한 3가지의 가젯 상태를 의미합니다.
approval
-- 사용자가 아직 액세스를 허용하지 않은 경우 가젯은 approval <div>
를 사용하여 요청 토큰을 포함한 '가젯을 원하는 대로 만들기' 링크와 함께 UI를 표시합니다. 사용자가 이 링크를 클릭하면 승인 과정이 시작됩니다.waiting
-- 사용자가 팝업 창을 열기는 했지만 액세스를 승인하지 않은 경우 가젯에 이 <div>
가 표시됩니다. 가젯은 사용자가 데이터에 대한 액세스를 승인했는지 확인하도록 요청하는 메시지를 표시합니다. 사용자가 액세스를 승인했는지 가젯이 자동으로 탐지할 수 있으면 사용자가 이 링크를 클릭하지 않아도 되지만 링크를 표시하면 자동 탐색이 실패하는 경우에도 데이터를 가져오도록 사용자가 선택할 수 있습니다. 자동 탐색이 실패하면 가젯에 '데이터에 대한 액세스를 승인한 다음 액세스 승인 완료를 클릭하십시오.'라는 메시지가 표시됩니다.사용자가 클릭하면 가젯이 fetchData()
함수를 호출하여 사용자의 데이터를 가져옵니다.main
-- 액세스 토큰이 발급되면 가젯은 main <div>
를 사용하여 가젯이 실행될 때마다 사용자의 데이터를 표시합니다. 이<div>
는 오류를 표시할 때도 사용됩니다.
<div id="main" style="display: none">
</div>
<div id="approval" style="display: none">
<img src="http://gadget-doc-examples.googlecode.com/svn/trunk/images/new.gif">
<a href="#" id="personalize">Personalize this gadget</a>
</div>
<div id="waiting" style="display: none">
Please click
<a href="#" id="approvaldone">I've approved access</a>
once you've approved access to your data.
</div>
<script type="text/javascript">
function showOneSection(toshow) {
var sections = [ 'main', 'approval', 'waiting' ];
for (var i=0; i < sections.length; ++i) {
var s = sections[i];
var el = document.getElementById(s);
if (s === toshow) {
el.style.display = "block";
} else {
el.style.display = "none";
}
}
}
makeRequest()에 대해 자세히 알아보기
makeRequest()
함수는 원격 콘텐츠 가져오기에 자세히 설명되어 있으며 원격 웹 콘텐츠를 가져오거나 작업하는 데 이 함수를 사용합니다. 다음 인수를 필요로 합니다.
String url
- 콘텐츠가 있는 URL입니다.Function callback
- URL에서 데이터를 가져온 다음 데이터와 함께 호출하는 함수Map.<gadgets.io.RequestParameters, Object> opt_params
- 요청에 전달할 추가 매개변수입니다.
opt_params[gadgets.io.RequestParameters.AUTHORIZATION]
을 gadgets.io.AuthorizationType.OAUTH
로 설정하면 컨테이너에서 OAuth를 사용하여 요청에 지정된 리소스에 대한 액세스를 허가받아야 합니다. 이 경우 일반적으로 가젯은 사용자를 서비스 제공업체로 안내하여 액세스를 허가받도록 만들어 사용자의 콘텐츠를 가져와야 합니다.
선택 매개변수
opt_params
에서 다음과 같은 OAuth 매개변수를 추가로 지정할 수 있습니다.
매개변수 | 설명 |
---|
gadgets.io.RequestParameters.OAUTH_SERVICE_NAME | 가젯이 XML 상세정보의 OAuth <Service> 요소를 참조하는 닉네임입니다. 서비스 이름은<ModulePrefs> 의 /ModulePrefs/OAuth/Service XML 섹션에서도 지정할 수 있습니다. 둘 중 어디에서도 지정하지 않은 경우 기본값은 ""입니다. |
gadgets.io.RequestParameters.OAUTH_TOKEN_NAME | 가젯에서 특정 리소스에 대한 액세스를 허용하는 OAuth 토큰을 지칭하는 닉네임입니다. 지정하지 않을 경우 기본값은 ""입니다. 가젯은 같은 서비스 제공업체의 여러 리소스에 대한 액세스 권한이 있는 경우 여러 개의 토큰 이름을 사용할 수 있습니다. 예를 들어 주소록 및 캘린더에 대한 액세스 권한이 있는 가젯은 "contacts"라는 이름의 토큰을 사용하여 주소록 토큰을 사용하거나 "calendar"의 주소록을 사용하여 캘린더 토큰을 사용할 수 있습니다. |
gadgets.io.RequestParameters.OAUTH_REQUEST_TOKEN | 서비스 제공업체는 리소스에 대한 액세스가 사전에 승인된 요청 토큰을 가젯에 자동으로 제공할 수 있습니다. 가젯은 이 토큰을 매개변수와 함께 사용할 수 있으며 매개변수는 선택사항입니다. |
gadgets.io.RequestParameters.OAUTH_REQUEST_TOKEN_SECRET | 사전 승인된 요청 토큰에 해당하는 비밀번호이며 매개변수는 선택사항입니다. |
gadgets.io.RequestParameters.OAUTH_USE_TOKEN | 이 매개변수는 "never", "if_available" 또는 "always" 중 한 값이 될 수 있습니다. OAuth 액세스 토큰이 필요하지 않은 일부 서비스 제공업체 API로서 해당 API는 OAuth 소비자 키를 통해 호출 응용프로그램을 인증한 다음 요청을 진행하도록 허가합니다. 이러한 API에 액세스하기 위해 불필요한 사용자 승인 요청을 피하려면OAUTH_USE_TOKEN 을 "never"로 설정합니다. 일부 OAuth API는 사용자가 승인하지 않은 경우 제한된 데이터를 제공하고 사용자가 호출 응용프로그램에 액세스 토큰을 허용한 경우에만 추가 기능을 제공할 수 있습니다. OAuth 액세스 토큰을 승인하는 API를 사용하지만 토큰이 필요하지 않은 경우에는OAUTH_USE_TOKEN 을 "if_available"로 설정합니다. 사용자가 액세스를 이미 승인한 경우 액세스 토큰이 전송됩니다. 사용자가 액세스를 승인하지 않은 경우 요청은 액세스 토큰이 없어도 처리됩니다. 대부분의 OAuth API는 액세스 토큰이 전송되는 경우에만 작동합니다. 그러므로 이러한 API를 사용하려면 먼저 사용자의 승인을 요청해야 합니다. 액세스 토큰을 사용하려면 OAUTH_USE_TOKEN 을 "always"로 설정합니다. 사용 가능한 액세스 토큰이 없으면 가젯에 승인 URL이 반환됩니다. AUTHORIZATION 을 SIGNED 로 설정한 경우OAUTH_USE_TOKEN 기본값은 "never"입니다.AUTHORIZATION 을 OAUTH 로 설정한 경우OAUTH_USE_TOKEN 기본값은 "always"입니다.
|
OAuth를 사용하는 경우 컨테이너가 가젯을 대신하여 OAuth 프로토콜을 실행합니다. OAuth 서비스 제공업체 참고사항에 설명된 것처럼 가젯에 iGoogle에서 사용할 소비자 키를 등록하지 않았으면 iGoogle은 기본 RSA 서명 키를 사용합니다.
Callback 매개변수
makeRequest()
콜백 매개변수는 makeRequest()
함수에서 반환한 일반적인 값 외에 몇 가지 OAuth에 해당하는 필드가 있는 자바스크립트 개체로 전달됩니다.
OAuth 필드 | 설명 |
---|
oauthApprovalUrl | 이 값을 지정한 경우 값은 서비스 제공업체에서 발급한 요청 토큰을 포함하는 URL입니다. 널(null)이 아닌 값을 지정하면 사용자가 외부 페이지를 방문하여 가젯의 데이터 액세스 요청을 승인해야 합니다. 사용자를 외부 페이지로 안내하는 팝업 창을 사용하는 것이 좋습니다. 사용자가 액세스를 승인하면 가젯은 makeRequest() 호출을 반복하여 데이터를 가져올 수 있습니다. |
oauthError | 이 값이 지정되어 있으면 OAuth 관련 오류가 발생했다는 의미입니다. |
oauthErrorText | 이 값이 지정되어 있으면 OAuth 관련 오류가 발생했다는 의미입니다. 이 값을 사용하여 가젯 개발자에게 디버깅 정보를 제공할 수 있습니다. 매개변수:String url -- 콘텐츠가 위치한 URL입니다.Function callback --- URL에서 데이터를 가져온 다음 데이터와 함께 호출하는 함수입니다.Map.<gadgets.io.RequestParameters, Object> opt_params -- 추가 요청 매개변수 또는 프록시 요청 매개변수입니다.
|
OAuth에 대한 오픈소셜 확장 기능
오픈소셜 컨테이너는 OAuth 요청에 추가로 서명된 매개변수를 전달하여 OAuth 서비스 제공업체 사이트에 보내는 요청에 대한 추가 콘텍스트 정보를 제공할 수 있습니다. opensocial_owner_id
, opensocial_app_url
같은 추가 매개변수에 대한 설명은gadgets.io.makeRequest
문서에 자세히 설명되어 있습니다. 오픈소셜을 인식하는 서비스 제공업체는 이들 매개변수를 사용하여 추가 데이터를 사용자에게 반환할 수 있습니다. 예를 들어 서비스 제공업체는 가젯의 사용자뿐 아니라 사용자의 친구에 대한 정보를 반환할 수도 있습니다.
Google 데이터 API: 대안적 접근방식
위의 예제에서는 gadgets.* makeRequest()
메서드를 사용하여 데이터를 가져옵니다. 하지만 Google 데이터 API를 사용할 경우 OAuth 프록시와 같이 작동하는 Google 데이터 자바스크립트 라이브러리를 사용할 수 있습니다. 뒤에서 makeRequest()
를 호출하므로 가젯에서의 최종 효과는 마찬가지입니다.
자세한 설명 및 예제를 보려면 Google 데이터 가젯 만들기 항목을 참조하십시오.
OAuth 서비스 제공업체의 경우 승인 팝업 창이 표시되지 않도록 하여 가젯에 대한 사용자의 만족도를 향상시킬 수 있습니다. 사용자가 해당 사이트의 가젯을 추가하면 사용자 데이터에 대한 액세스를 받는 데 사용하는 사전 승인된 OAuth 요청 토큰을 iGoogle에 전달합니다.
승인 과정은 다음과 같습니다.
- 사용자가 서비스 제공업체 사이트에 로그인합니다.
- 서비스 제공업체 사이트에는 Google에 추가 링크가 있습니다. 서비스 제공업체는 이 링크에 일반적으로 사용하는Google에 추가 로고를 사용해야 합니다.
- 링크 대상은 사전 승인된 OAuth 요청 토큰을 발급할 수 있는 서비스 제공업체 사이트의 특수 URL입니다. 이 URL은 보안상의 이유로 CSRF 공격에 대비해 보호해야 합니다.
- 서비스 제공업체의 사전 승인 URL에서 사용자를 인증하고 사용자 데이터에 대한 액세스를 허용하는 사전 승인된 OAuth 요청 토큰을 만듭니다. 그런 다음 사전 승인 URL에서 사용자에게 iGoogle
addmodule
URL로의 리디렉션을 전송합니다. 리디렉션 URL에는 요청 토큰과 선택하는 경우 요청 토큰 비밀번호가 포함됩니다. - iGoogle에서 사용자에게 가젯을 추가할지 확인하도록 요청합니다.
- 사용자가 가젯을 추가할지 확인하면 사전 승인된 요청 토큰이 OAuth 액세스 토큰과 교환되어 사용자의 데이터를 즉시 사용할 수 있습니다.
사전 승인 URL 구현
OAuth 사전 승인 URL에서는 사전 승인된 OAuth 요청 토큰을 만든 다음 사용자를 토큰을 사용하는 addmodule
URL로 리디렉션해야 합니다. 사전 승인된 OAuth 토큰을 만드는 방법은 OAuth 서비스 제공업체 상세정보에 따라 다르지만 사전 승인된 토큰은 다음과 같은 특성을 가져야 합니다.
- 액세스할 데이터를 소유한 사용자를 식별해야 합니다.
- 단지 몇 분 동안만 사용할 수 있도록 사용 기간이 짧아야 합니다.
- 1회용이므로 토큰을 한번 사용하면 다른 사람이 토큰을 도용하더라도 사용자 데이터에 액세스할 수 없습니다.
서비스 제공업체 사이트에서 사전 승인된 요청 토큰을 만들면 해당 사이트는 사전 승인된 요청 토큰(및 선택한 경우 토큰 비밀번호)을 요청에 포함하여 iGoogle addmodule
URL로 이동하는 리디렉션을 사용자에게 전송해야 합니다. 리디렉션은 다음과 같은 형태입니다.
http://www.google.com/ig/add?moduleurl=<URL OF GADGET>&up_request_token=<REQUEST TOKEN>&up_request_token_secret=<REQUEST TOKEN SECRET>
리디렉션 URL과 마찬가지로 쿼리 매개변수는 URL 인코딩해야 합니다.
up_
프리픽스가 붙은 매개변수는 가젯에 대한 사용자 환경설정입니다. up_rt
매개변수 값은 가젯의 rt
사용자 환경설정 값이 됩니다. iGoogle에서는 사용자 환경설정에 영·숫자, 마침표(.) 문자 및 공백 입력만 허용합니다. 요청 토큰 또는 요청 토큰 비밀번호에 기타 문자가 포함되어 있으면 iGoogle에서 자동으로 그 값을 가젯에 추가하도록 허용하기 전에 인코딩해야하는 경우도 있습니다.
사용자 환경설정 추가
사전 승인된 요청 토큰을 사용하려면 가젯을 약간 수정해야 합니다. 먼저 setprefs
기능을 요청하고 요청 토큰 및 요청 토큰 비밀번호에 대한 두 가지 새로운 사용자 환경설정을 표시하도록 가젯 상세정보를 업데이트해야 합니다.
...
<ModulePrefs title="Preapproved OAuth Gadget" scrolling="true">
<Require feature="setprefs" />
<OAuth>
<Service>
...
</Service>
</OAuth>
</ModulePrefs>
<UserPref name="request_token" required="false" datatype="hidden"></UserPref>
<UserPref name="request_token_secret" required="false" datatype="hidden"></UserPref>
...
가젯 상세정보에 이들 매개변수를 추가하고 가젯 스크립트에서 새 사용자 환경설정을 gadgets.io.makeRequest()
함수로 전달해야 합니다. 예:
params.AUTHORIZATION = "OAUTH";
var prefs = new gadgets.Prefs();
var requestToken = prefs.getString("request_token");
if (requestToken !== "") {
// We have a preapproved request token
params.OAUTH_REQUEST_TOKEN = requestToken;
params.OAUTH_REQUEST_TOKEN_SECRET = prefs.getString("request_token_secret");
// Preapproved request tokens are only good once
prefs.set("request_token", "");
prefs.set("request_token_secret", "");
}
gadgets.io.makeRequest(url, callback, params);
코드에서는 먼저 request_token
사용자 환경설정을 사용해야 하는지 여부를 확인합니다.
var prefs = new gadgets.Prefs();
var requestToken = prefs.getString("request_token");
if (requestToken !== "") {
...
}
request_token
사용자 환경설정이 비어 있지 않으면 가젯은 params.OAUTH_REQUEST_TOKEN
및params.OAUTH_REQUEST_TOKEN_SECRET
값을 설정하여 사전 승인된 요청 토큰을 사용하려고 시도합니다.
if (requestToken !== "") {
// We have a preapproved request token
params.OAUTH_REQUEST_TOKEN = requestToken;
params.OAUTH_REQUEST_TOKEN_SECRET = prefs.getString("request_token_secret");
// Preapproved request tokens are only good once
prefs.set("request_token", "");
prefs.set("request_token_secret", "");
}
사전 승인된 요청 토큰은 한번만 사용할 수 있습니다. 가젯이 환경설정을 다시 사용하지 못하도록 하려면 환경설정을makeRequest()
매개변수에 복사하여 넣은 다음 prefs.set()
를 호출하여 환결설정을 삭제해야 합니다.
prefs.set("request_token", "");
prefs.set("request_token_secret", "");
마지막 단계로 매개변수를 포함한 gadgets.io.makeRequest()
를 호출합니다. 사전 승인된 요청 토큰이 유효한 경우 가젯은 사용자의 승인을 얻는 팝업 창을 열지 않고도 사용자 데이터에 대한 액세스를 얻을 수 있습니다.
가젯이 사전 승인된 요청 토큰을 사용하여 데이터에 대한 액세스를 얻으리라 생각하더라도 사용자가 팝업 창을 통해 액세스를 허용하도록 계속 지원해야 합니다. 사용자가 iGoogle 디렉토리의 가젯을 추가하면 사전 승인된 요청 토큰이 없습니다.
기타 예제
다음은 시작하는 데 도움이 될 만한 몇 가지 다른 샘플 OAuth 가젯입니다.
고급 OAuth 기술
Google은 이 기술에 대한 여러 가지 향상 기능에 대해 연구하고 있습니다. 그러한 향상 기능 및 OAuth에 사용 가능한 기타 고급 기술에 대한 정보는 Google에서 유지 관리하는 고급 OAuth 기술 사이트를 참조하시기 바랍니다.