imapsync/W/learn/oauth2
Nick Bebout 8d76e44c5e 1.836
2017-09-23 16:54:48 -05:00

81 lines
2.5 KiB
Perl
Executable file

#!/usr/bin/perl
use HTTP::Request::Common qw(POST);
use LWP::UserAgent;
use Data::Dumper;
use Mail::IMAPClient;
use URI::Escape;
use MIME::Base64;
print "\n\nType your email address here: ";
$username = "gilles.lamiral@gmail.com" ;
chomp($username);
print "\n\nPaste the client_id here: ";
$client_id = '108687549524-86sjq07f3ch8otl9fnr56mjnniltdrvn.apps.googleusercontent.com' ;
chomp($client_id);
print "\n\nPaste the client_secret here: ";
$client_secret = 'zAJO4PLxzeJ4yOaiJRk6f69k' ;
chomp($client_secret);
$scope_string = "https%3A%2F%2Fmail.google.com%2F";
print "Please open the following in your web browser:\n\nhttps://accounts.google.com/o/oauth2/auth?scope=$scope_string&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=$client_id";
print "\n\nPaste the code here: ";
$code = '4/-e6wojtOSXCjZnwZKKhvg3AdDqDjGLOF0nXxfAFcdmk';
#
chomp($code);
$ENV{'PERL_LWP_SSL_VERIFY_HOSTNAME'} = 0;
my $ua = LWP::UserAgent->new;
$ua->timeout(10);
$ua->env_proxy;
print "Exchanging the code for an access token and refresh token...\n";
my $exchange_response = $ua->request(POST 'https://accounts.google.com/o/oauth2/token',
'Content_Type' => 'application/x-www-form-urlencoded',
'Content' => [
'code' => $code,
'client_id' => $client_id,
'client_secret' => $client_secret,
'redirect_uri' => 'urn:ietf:wg:oauth:2.0:oob',
'grant_type' => 'authorization_code',
],
);
my ($access_token) = ($exchange_response->decoded_content =~ m/access_token"."(.)"/);
my ($refresh_token) = ($exchange_response->decoded_content =~ m/refresh_token"."(.)"/);
print "exchange_response: ", $exchange_response->decoded_content, "\n" ;
print "access token: $access_token\n";
print "refresh token: $refresh_token\n";
print "Refreshing the access token...\n";
my $auth_response = $ua->request(POST 'https://accounts.google.com/o/oauth2/token',
'Host' => 'accounts.google.com',
'Content_Type' => 'application/x-www-form-urlencoded',
'Content' => [
'client_id' => $client_id,
'client_secret' => $client_secret,
'refresh_token' => $refresh_token,
'grant_type' => 'refresh_token',
],
);
my ($access_token) = ($auth_response->decoded_content =~ m/access_token"."(.)"/);
my $oauth_sign = encode_base64("user=". $username ."\x01auth=Bearer ". $access_token ."\x01\x01", '');
my $imap = Mail::IMAPClient->new(
Server => 'imap.gmail.com',
Port => 993,
Ssl => 1,
Uid => 1,
) or die("Can't connect to imap server.");
$imap->authenticate('XOAUTH2', sub { return $oauth_sign }) or die("Auth error: ". $imap->LastError);
print join(", ",$imap->folders),".\n" or die("List folders error: ". $imap->LastError);