이는 Google API에서 OAuth 2.0 승인 및 인증을 사용하기 위해 Google이 공식적으로 지원하는 Ruby 클라이언트 라이브러리입니다.
https://rubygems.org/
가 gem 소스에 있는지 확인하세요.
일반적인 클라이언트 사용의 경우 다음과 같이 충분합니다.
$ gem install googleauth
require 'googleauth'
# Get the environment configured authorization
scopes = [ 'https://www.googleapis.com/auth/cloud-platform' ,
'https://www.googleapis.com/auth/compute' ]
authorization = Google :: Auth . get_application_default ( scopes )
# Add the the access token obtained using the authorization to a hash, e.g
# headers.
some_headers = { }
authorization . apply ( some_headers )
이 라이브러리는 Ruby용 애플리케이션 기본 자격 증명의 구현을 제공합니다.
애플리케이션 기본 자격 증명은 Google API 호출에 사용할 인증 자격 증명을 얻는 간단한 방법을 제공합니다.
호출이 사용자와 관계없이 애플리케이션에 대해 동일한 ID 및 인증 수준을 가져야 하는 경우에 가장 적합합니다. 이는 특히 Google Compute Engine을 사용하는 애플리케이션을 구축할 때 Cloud API 호출을 승인하는 데 권장되는 접근 방식입니다.
또한 라이브러리는 사용자 자격 증명(3-Legged OAuth2) 요청 및 저장에 대한 지원을 제공합니다. 현재 두 가지 구현을 사용할 수 있습니다. 하나는 명령줄 앱이나 사용자 정의 통합에 유용한 일반 권한 부여자와 랙 기반 애플리케이션에 맞게 조정된 웹 변형입니다.
승인자는 승인 사용 사례를 위한 것입니다. 로그인하려면 Google Identity Platform을 참조하세요.
require 'googleauth'
require 'googleauth/web_user_authorizer'
require 'googleauth/stores/redis_token_store'
require 'redis'
client_id = Google :: Auth :: ClientId . from_file ( '/path/to/client_secrets.json' )
scope = [ 'https://www.googleapis.com/auth/drive' ]
token_store = Google :: Auth :: Stores :: RedisTokenStore . new ( redis : Redis . new )
authorizer = Google :: Auth :: WebUserAuthorizer . new (
client_id , scope , token_store , '/oauth2callback' )
get ( '/authorize' ) do
# NOTE: Assumes the user is already authenticated to the app
user_id = request . session [ 'user_id' ]
credentials = authorizer . get_credentials ( user_id , request )
if credentials . nil?
redirect authorizer . get_authorization_url ( login_hint : user_id , request : request )
end
# Credentials are valid, can call APIs
# ...
end
get ( '/oauth2callback' ) do
target_url = Google :: Auth :: WebUserAuthorizer . handle_auth_callback_deferred (
request )
redirect target_url
end
PKCE(코드 교환용 증명 키)는 악의적인 운영 체제 프로세스가 OAUTH 2.0 교환을 하이재킹하는 것을 방지하는 것을 목표로 하는 RFC입니다. PKCE는 인증 요청에 code_challenge
및 code_challenge_method
매개변수를 포함하고 액세스 토큰 요청에 code_verifier
매개변수를 포함하여 위의 취약점을 완화합니다.
require 'googleauth'
require 'googleauth/web_user_authorizer'
require 'googleauth/stores/redis_token_store'
require 'redis'
client_id = Google :: Auth :: ClientId . from_file ( '/path/to/client_secrets.json' )
scope = [ 'https://www.googleapis.com/auth/drive' ]
token_store = Google :: Auth :: Stores :: RedisTokenStore . new ( redis : Redis . new )
authorizer = Google :: Auth :: WebUserAuthorizer . new (
client_id , scope , token_store , '/oauth2callback' )
get ( '/authorize' ) do
# NOTE: Assumes the user is already authenticated to the app
user_id = request . session [ 'user_id' ]
# User needs to take care of generating the code_verifier and storing it in
# the session.
request . session [ 'code_verifier' ] ||= Google :: Auth :: WebUserAuthorizer . generate_code_verifier
authorizer . code_verifier = request . session [ 'code_verifier' ]
credentials = authorizer . get_credentials ( user_id , request )
if credentials . nil?
redirect authorizer . get_authorization_url ( login_hint : user_id , request : request )
end
# Credentials are valid, can call APIs
# ...
end
get ( '/oauth2callback' ) do
target_url = Google :: Auth :: WebUserAuthorizer . handle_auth_callback_deferred (
request )
redirect target_url
end
Google 인증 OOB 흐름은 2023년 1월 31일에 중단되었습니다. OOB 흐름은 더 이상 안전한 것으로 간주되지 않는 기존 흐름입니다. Google 인증을 계속 사용하려면 애플리케이션을 보다 안전한 흐름으로 마이그레이션하세요. 이를 수행하는 방법에 대한 자세한 내용은 OOB 마이그레이션 가이드를 참조하세요.
require 'googleauth'
require 'googleauth/stores/file_token_store'
OOB_URI = 'urn:ietf:wg:oauth:2.0:oob'
scope = 'https://www.googleapis.com/auth/drive'
client_id = Google :: Auth :: ClientId . from_file ( '/path/to/client_secrets.json' )
token_store = Google :: Auth :: Stores :: FileTokenStore . new (
:file => '/path/to/tokens.yaml' )
authorizer = Google :: Auth :: UserAuthorizer . new ( client_id , scope , token_store )
user_id = ENV [ 'USER' ]
credentials = authorizer . get_credentials ( user_id )
if credentials . nil?
url = authorizer . get_authorization_url ( base_url : OOB_URI )
puts "Open #{ url } in your browser and enter the resulting code:"
code = gets
credentials = authorizer . get_and_store_credentials_from_code (
user_id : user_id , code : code , base_url : OOB_URI )
end
# OK to use credentials
scope = 'https://www.googleapis.com/auth/androidpublisher'
authorizer = Google :: Auth :: ServiceAccountCredentials . make_creds (
json_key_io : File . open ( '/path/to/service_account_json_key.json' ) ,
scope : scope )
authorizer . fetch_access_token!
GOOGLE_APPLICATION_CREDENTIALS
환경 변수를 설정하여 JSON 키 파일을 사용할 수도 있습니다.
export GOOGLE_APPLICATION_CREDENTIALS=/path/to/service_account_json_key.json
require 'googleauth'
require 'google/apis/drive_v3'
Drive = :: Google :: Apis :: DriveV3
drive = Drive :: DriveService . new
scope = 'https://www.googleapis.com/auth/drive'
authorizer = Google :: Auth :: ServiceAccountCredentials . from_env ( scope : scope )
drive . authorization = authorizer
list_files = drive . list_files ( )
이는 일반 서비스 계정 승인과 유사합니다(차이점에 대한 자세한 내용은 이 답변 참조). 그러나 sub
필드를 수동으로 업데이트하여 서비스 계정이 가장하는 사용자를 표시해야 합니다.
scope = 'https://www.googleapis.com/auth/androidpublisher'
authorizer = Google :: Auth :: ServiceAccountCredentials . make_creds (
json_key_io : File . open ( '/path/to/service_account_json_key.json' ) ,
scope : scope
)
authorizer . update! ( sub : "[email protected]" )
authorizer . fetch_access_token!
export GOOGLE_ACCOUNT_TYPE=service_account
export GOOGLE_CLIENT_ID=000000000000000000000
export [email protected]
export GOOGLE_PRIVATE_KEY= " -----BEGIN PRIVATE KEY-----n...n-----END PRIVATE KEY-----n "
require 'googleauth'
require 'google/apis/drive_v3'
Drive = :: Google :: Apis :: DriveV3
drive = Drive :: DriveService . new
# Auths with ENV vars:
# "GOOGLE_CLIENT_ID",
# "GOOGLE_CLIENT_EMAIL",
# "GOOGLE_ACCOUNT_TYPE",
# "GOOGLE_PRIVATE_KEY"
auth = :: Google :: Auth :: ServiceAccountCredentials
. make_creds ( scope : 'https://www.googleapis.com/auth/drive' )
drive . authorization = auth
list_files = drive . list_files ( )
권한 부여자는 액세스 및 새로 고침 토큰의 장기간 지속성을 관리하기 위해 스토리지 인스턴스가 필요합니다. 두 가지 저장소 구현이 포함됩니다.
사용자 정의 스토리지 구현도 사용할 수 있습니다. 자세한 내용은 token_store.rb를 참조하세요.
이 라이브러리는 Ruby 2.6+에서 지원됩니다.
Google은 Ruby Core에서 적극적으로 지원하는 Ruby 버전, 즉 일반 유지 관리 또는 보안 유지 관리 중이며 지원이 종료되지 않은 Ruby 버전에 대한 공식 지원을 제공합니다. 이전 버전의 Ruby는 여전히 작동 할 수 있지만 지원되지 않으며 권장되지 않습니다. Ruby 지원 일정에 대한 자세한 내용은 https://www.ruby-lang.org/en/downloads/branches/를 참조하세요.
이 라이브러리는 Apache 2.0에 따라 라이센스가 부여되었습니다. 전체 라이센스 텍스트는 LICENSE에서 볼 수 있습니다.
기여를 참조하세요.
Github의 프로젝트에서 버그를 보고해 주세요. StackOverflow의 클라이언트나 API에 대해 주저하지 말고 질문하세요.