Это официально поддерживаемая Google клиентская библиотека Ruby для использования авторизации и аутентификации OAuth 2.0 с помощью API Google.
Убедитесь, что https://rubygems.org/
находится в ваших источниках драгоценных камней.
Для обычного использования клиента этого достаточно:
$ 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.
Учетные данные приложения по умолчанию предоставляют простой способ получить учетные данные авторизации для использования при вызове API Google.
Они лучше всего подходят для случаев, когда вызов должен иметь одинаковую идентификацию и уровень авторизации для приложения, независимого от пользователя. Это рекомендуемый подход для авторизации вызовов Cloud API, особенно при создании приложения, использующего Google Compute Engine.
Библиотека также обеспечивает поддержку запроса и хранения учетных данных пользователя (3-Legged OAuth2). В настоящее время доступны две реализации: универсальный авторизатор, полезный для приложений командной строки или пользовательских интеграций, а также веб-вариант, адаптированный для приложений на базе Rack.
Авторизаторы предназначены для случаев использования авторизации. Для входа в систему см. 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) — это RFC, целью которого является предотвращение перехвата вредоносными процессами операционной системы обмена OAUTH 2.0. 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
Поток OOB Google Auth был прекращен 31 января 2023 г. Поток OOB — это устаревший поток, который больше не считается безопасным. Чтобы продолжить использовать Google Auth, перенесите свои приложения на более безопасный поток. Для получения дополнительной информации о том, как это сделать, обратитесь к этому руководству по миграции 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!
Вы также можете использовать ключевой файл JSON, установив переменную среды GOOGLE_APPLICATION_CREDENTIALS
.
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, которые активно поддерживаются Ruby Core, то есть версий Ruby, которые либо находятся на обычном обслуживании, либо на обслуживании безопасности, но не истекли. Старые версии Ruby все еще могут работать, но они не поддерживаются и не рекомендуются. См. https://www.ruby-lang.org/en/downloads/branches/ для получения подробной информации о графике поддержки Ruby.
Эта библиотека распространяется под лицензией Apache 2.0. Полный текст лицензии доступен в разделе ЛИЦЕНЗИЯ.
См. ВКЛАД.
Пожалуйста, сообщайте об ошибках в проекте на Github. Не стесняйтесь задавать вопросы о клиенте или API на StackOverflow.