2

나는 서비스 계정을 가지고 있고 나는 Google API Ruby Client와 함께 OAuth2를 보석을 사용하고 있습니다 :서비스 계정 (Ruby 클라이언트)을 사용하여 가장하도록 Google API 사용자를 설정하는 방법은 무엇입니까?

require 'oauth2' 
require 'google/api_client' 

내 목표는 특정 사용자의 계정과 다른 액세스를 허용하는 액세스 토큰을 가져올 것입니다. 나는 이것이 종종 HTTP를 사용할 때 sub 매개 변수를 사용하여 달성된다고 생각하지만 위의 Ruby 클라이언트 라이브러리를 사용하여 어떻게해야합니까?

액세스 토큰을 성공적으로 가져 와서 드라이브 v2 파일 목록 API에 액세스 할 수 있습니다. 나는 항상 하나의 "드라이브로 시작하는 법"문서를 응답에서 볼 수 있으며 다른 문서는 볼 수 없다.

사용자를 가장하려고 시도한 것이 성공적이지 않은 것 같습니다. 기본적으로 나는 아래의 함수에 sub 옵션으로 전자 메일 주소를 전달 해요 :

client = Google::APIClient.new(...) 
access_token = OAuth2::AccessToken.new(oauth2_client, client.authorization.access_token, {‘sub’ => ‘[email protected]’}) 

것은 아마도 그것은이 작업을 수행하는 방법이 아니다.

단일 사용자로 위장하는 액세스를 허용하고 다른 사용자는 액세스 토큰을 검색하는 방법은 무엇입니까?


Steve의 의견에 따라 보석을 삭제했으며 현재 Signet을 사용 중입니다. 나는 좀 더 나아졌지만 a : person을 지정할 때 access_denied 오류가 발생했습니다. 그것 없이는 나는 인증 할 수 있지만 분명히 나는 ​​발행자로서 접근 할 수있다.

require 'google/api_client' 
... 
client = Google::APIClient.new(:application_name => application_name, :application_version => application_version) 
... 
opts = { 
    :token_credential_uri => 'https://accounts.google.com/o/oauth2/token', 
    :audience => 'https://accounts.google.com/o/oauth2/token', 
    :scope => scope, 
    :issuer => service_account_email_address, 
    :signing_key => key, 
    :person => '[email protected]' 
}) 
client.authorization = Signet::OAuth2::Client.new(opts) 
access_token = client.authorization.fetch_access_token! 
... 

>> client.authorization.fetch_access_token! 
Signet::AuthorizationError: Authorization failed. Server message: 
{ 
    "error" : "access_denied", 
    "error_description" : "Requested client not authorized." 
} 

'테스트 설치 흐름'을 수행하지만 클라이언트가 신뢰할 수없는 것으로 보이는 콘솔 프로젝트가 있습니다. 어디서 봤어?

감사합니다.

답변

1

다음은 요약입니다.

Google에서만 인증을 시도하는 경우 intridea에서 OAuth2 gem을 사용하지 마십시오. 인장 보석에 의지하십시오.

서비스 계정을 사용하는 경우 a : person 요소를 지정할 수 있으며 해당 사용자를 가장하여 자신을 대신하여 작동하도록 작동합니다.

통합을 테스트 할 때는 프로젝트가 호스팅 된 도메인에 대해 그렇게해야합니다. 앱을 게시 할 때까지 제 3 자 도메인에서 테스트 할 수 없습니다!

+0

귀하의 솔루션은 Signet 사용 권한을 부여하는 방법에 대한이 질문의 답과 비슷합니까? http://stackoverflow.com/questions/18468655/trouble-with-google-apps-api-and-service-accounts-in-ruby – mmcrae

+0

예. 기본적으로 Signet을 사용하십시오. –

1

intridea의 oauth2 gem을 사용하는 방법을 모르지만 ruby ​​클라이언트 라이브러리의 기본값 인 인장은이 케이스를 직접 처리합니다.

readme에서이 작업을 수행하는 방법에 대한 요약본이 있습니다. 유일한 추가 사항은 특정 사용자에 대한 토큰을 얻기 위해 제목을 추가하는 것입니다. OAuth2 클라이언트를 인스턴스화하거나 옵션으로 지정할 때 지정 될 수 있습니다. fetch_access_token!