นี่คือไลบรารีไคลเอ็นต์ Ruby ที่ได้รับการสนับสนุนอย่างเป็นทางการของ Google สำหรับการใช้การให้สิทธิ์และการตรวจสอบสิทธิ์ OAuth 2.0 กับ Google API
ตรวจสอบให้แน่ใจว่า 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
ข้อมูลรับรองเริ่มต้นของแอปพลิเคชันเป็นวิธีง่ายๆ ในการรับข้อมูลรับรองการอนุญาตเพื่อใช้ในการเรียก Google API
เหมาะที่สุดสำหรับกรณีที่การโทรจำเป็นต้องมีข้อมูลประจำตัวและการอนุญาตระดับเดียวกันสำหรับแอปพลิเคชันที่ไม่ขึ้นอยู่กับผู้ใช้ นี่เป็นแนวทางที่แนะนำในการอนุญาตการโทรไปยัง Cloud API โดยเฉพาะอย่างยิ่งเมื่อคุณสร้างแอปพลิเคชันที่ใช้ Google Compute Engine
ไลบรารียังให้การสนับสนุนสำหรับการร้องขอและจัดเก็บข้อมูลประจำตัวผู้ใช้ (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
Proof Key for Code Exchange (PKCE) คือ RFC ที่มีจุดมุ่งหมายเพื่อป้องกันกระบวนการของระบบปฏิบัติการที่เป็นอันตรายจากการแย่งชิงการแลกเปลี่ยน OAUTH 2.0 PKCE ลดช่องโหว่ข้างต้นโดยรวมพารามิเตอร์ code_challenge
และ code_challenge_method
ใน Authorization Request และพารามิเตอร์ code_verifier
ใน Access Token Request
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 ข้อความลิขสิทธิ์ฉบับเต็มมีอยู่ใน LICENSE
ดูการมีส่วนร่วม
กรุณารายงานข้อบกพร่องที่โครงการบน Github อย่าลังเลที่จะถามคำถามเกี่ยวกับไคลเอนต์หรือ API บน StackOverflow