Esta é a biblioteca cliente Ruby com suporte oficial do Google para usar autorização e autenticação OAuth 2.0 com APIs do Google.
Certifique-se de que https://rubygems.org/
esteja em suas fontes de gemas.
Para uso normal do cliente, isso é suficiente:
$ 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 )
Esta biblioteca fornece uma implementação de credenciais padrão de aplicativo para Ruby.
As credenciais padrão do aplicativo fornecem uma maneira simples de obter credenciais de autorização para uso na chamada de APIs do Google.
Eles são mais adequados para casos em que a chamada precisa ter a mesma identidade e nível de autorização para a aplicação independente do usuário. Essa é a abordagem recomendada para autorizar chamadas para APIs do Cloud, principalmente ao criar um aplicativo que usa o Google Compute Engine.
A biblioteca também fornece suporte para solicitar e armazenar credenciais de usuário (3-Legged OAuth2). Duas implementações estão disponíveis atualmente, um autorizador genérico útil para aplicativos de linha de comando ou integrações personalizadas, bem como uma variante da web adaptada para aplicativos baseados em Rack.
Os autorizadores destinam-se a casos de uso de autorização. Para fazer login, consulte 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
Proof Key for Code Exchange (PKCE) é um RFC que visa evitar que processos maliciosos do sistema operacional sequestrem uma troca OAUTH 2.0. O PKCE atenua a vulnerabilidade acima incluindo os parâmetros code_challenge
e code_challenge_method
na solicitação de autorização e um parâmetro code_verifier
na solicitação de token de acesso.
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
O fluxo OOB do Google Auth foi descontinuado em 31 de janeiro de 2023. O fluxo OOB é um fluxo legado que não é mais considerado seguro. Para continuar usando o Google Auth, migre seus aplicativos para um fluxo mais seguro. Para obter mais informações sobre como fazer isso, consulte este guia de migração 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!
Você também pode usar um arquivo-chave JSON definindo a variável de ambiente 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 ( )
Isso é semelhante à autorização normal da conta de serviço (consulte esta resposta para obter mais detalhes sobre as diferenças), mas você precisará indicar qual usuário sua conta de serviço está representando, atualizando manualmente o 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 ( )
Os autorizadores exigem uma instância de armazenamento para gerenciar a persistência de longo prazo de acesso e tokens de atualização. Duas implementações de armazenamento estão incluídas:
Implementações de armazenamento personalizado também podem ser usadas. Consulte token_store.rb para obter detalhes adicionais.
Esta biblioteca é suportada em Ruby 2.6+.
O Google fornece suporte oficial para versões Ruby que são ativamente suportadas pelo Ruby Core - ou seja, versões Ruby que estão em manutenção normal ou em manutenção de segurança, e não em fim de vida. Versões mais antigas do Ruby ainda podem funcionar, mas não são suportadas e não são recomendadas. Consulte https://www.ruby-lang.org/en/downloads/branches/ para obter detalhes sobre o cronograma de suporte Ruby.
Esta biblioteca está licenciada sob Apache 2.0. O texto completo da licença está disponível em LICENSE.
Consulte CONTRIBUINDO.
Por favor, relate bugs no projeto no Github. Não hesite em fazer perguntas sobre o cliente ou APIs no StackOverflow.