これは、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) のサポートも提供します。現在、コマンド ライン アプリやカスタム統合に役立つ汎用オーソライザーとラックベースのアプリケーション向けに調整された Web バリアントの 2 つの実装が利用可能です。
オーソライザーは、承認の使用例を目的としています。サインオンについては、「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) は、悪意のあるオペレーティング システム プロセスによる 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 Auth OOB フローは、2023 年 1 月 31 日に廃止されました。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!
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 ( )
承認者は、アクセスとリフレッシュ トークンの長期持続性を管理するためにストレージ インスタンスを必要とします。次の 2 つのストレージ実装が含まれています。
カスタム ストレージ実装も使用できます。詳細については、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 について遠慮なく質問してください。