lib/asana/authentication/oauth2.rb
# frozen_string_literal: true
require_relative 'oauth2/bearer_token_authentication'
require_relative 'oauth2/access_token_authentication'
require_relative 'oauth2/client'
module Asana
module Authentication
# Public: Deals with OAuth2 authentication. Contains a function to get an
# access token throught a browserless authentication flow, needed for some
# applications such as CLI applications.
module OAuth2
module_function
# Public: Retrieves an access token through an offline authentication
# flow. If your application can receive HTTP requests, you might want to
# opt for a browser-based flow and use the omniauth-asana gem instead.
#
# Your registered application's redirect_uri should be exactly
# "urn:ietf:wg:oauth:2.0:oob".
#
# client_id - [String] the client id of the registered Asana API
# application.
# client_secret - [String] the client secret of the registered Asana API
# application.
#
# Returns an ::OAuth2::AccessToken object.
#
# Note: This function reads from STDIN and writes to STDOUT. It is meant
# to be used only within the context of a CLI application.
def offline_flow(client_id: required('client_id'),
client_secret: required('client_secret'))
client = Client.new(client_id: client_id,
client_secret: client_secret,
redirect_uri: 'urn:ietf:wg:oauth:2.0:oob')
$stdout.puts '1. Go to the following URL to authorize the ' \
"application: #{client.authorize_url}"
$stdout.puts '2. Paste the authorization code here: '
auth_code = $stdin.gets.chomp
client.token_from_auth_code(auth_code)
end
end
end
end