Skip to content

Instantly share code, notes, and snippets.

What would you like to do?
ruby command line script for generating google oauth2 access token
# (create oauth2 tokens from Google Console)
client_id = ""
client_secret = ""
# (paste the scope of the service you want here)
# e.g.:
scope = ""
# gem install oauth2
require 'oauth2'
raise "Missing client_id variable" if client_id.to_s.empty?
raise "Missing client_secret variable" if client_secret.to_s.empty?
raise "Missing scope variable" if scope.to_s.empty?
redirect_uri = 'https://localhost/oauth2callback'
auth_client_obj =, client_secret, {:site => '', :authorize_url => "/o/oauth2/auth", :token_url => "/o/oauth2/token"})
# STEP 1
puts "1) Paste this URL into your browser where you are logged in to the relevant Google account\n\n"
puts auth_client_obj.auth_code.authorize_url(:scope => scope, :access_type => "offline", :redirect_uri => redirect_uri, :approval_prompt => 'force')
# STEP 2
puts "\n\n\n2) Accept the authorization request from Google in your browser:"
# STEP 3
puts "\n\n\n3) Google will redirect you to localhost, but just copy the code parameter out of the URL they redirect you to, paste it here and hit enter:\n"
code = gets.chomp.strip
access_token_obj = auth_client_obj.auth_code.get_token(code, { :redirect_uri => redirect_uri, :token_method => :post })
# STEP 4
puts "Token is: #{access_token_obj.token}"
puts "Refresh token is: #{access_token_obj.refresh_token}"
puts "\n\n\nNow you can make API requests with the following api_access_token_obj variable!\n"
puts "api_client_obj =, client_secret, {:site => ''})"
puts "api_access_token_obj =, '#{access_token_obj.token}')"
puts "api_access_token_obj.get('some_relative_path_here') OR in your browser:{access_token_obj.token}"
puts "\n\n... and when that access_token expires in 1 hour, use this to refresh it:\n"
puts "refresh_client_obj =, client_secret, {:site => '', :authorize_url => '/o/oauth2/auth', :token_url => '/o/oauth2/token'})"
puts "refresh_access_token_obj =, '#{access_token_obj.token}', {refresh_token: '#{access_token_obj.refresh_token}'})"
puts "refresh_access_token_obj.refresh!"

This comment has been minimized.

Copy link

@edward edward commented Dec 17, 2012

When using a refresh token, you likely don’t care about the existing token, so get your new access token like this instead:

access_token = OAuth2::AccessToken.from_hash(client, :refresh_token => REFRESH_TOKEN).refresh!

Note that the assignment of access_token to itself is happening here because the expected in-place replacement of the access token that calling OAuth2::AccessToken#refresh! should provide doesn’t actually happen.


This comment has been minimized.

Copy link

@benmwendwa benmwendwa commented Oct 27, 2014

Thanks a lot edward. Your answer helped me solve the problem with refreshing a token. Cheers


This comment has been minimized.

Copy link

@NileshN NileshN commented Oct 6, 2017

Much Thanks. Very nicely explained and written. I was searching for this for couple of days. Thanks again.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment