2015-05-27 14 views
6

Mã này trong Perl đã hoạt động trong nhiều năm và bây giờ đăng nhập Bảng tính của tôi không thành công, khi tôi đăng nhập vào tài khoản của mình, tôi nhận thấy chuyển sang phiên bản Drive mới. Có lẽ một số phương pháp xác thực không được chấp nhận?Net :: Google :: AuthSub đăng nhập thất bại với phiên bản Google Drive mới

my $auth = Net::Google::AuthSub->new; 
my $response = $auth->login('[email protected]', 'PASS'); 
if ($response->is_success) { 
    print "Hurrah! Logged in\n"; 
} else { 
    die "Login failed: ".$response->error."\n"; 
} 

Kết quả là:

Login failed: 

Và mã:

use Net::Google::Spreadsheets; 
my $service = Net::Google::Spreadsheets->new(
username => '[email protected]', 
password => 'PASS' 
); 

Kết quả là:

Net::Google::AuthSub login failed at /usr/local/share/perl/5.18.2/Net/Google/Spreadsheets.pm line 42. 

Như đã đề cập ở đâu đó tôi đã cố gắng để bỏ qua việc kiểm tra giấy chứng nhận SSL với:

$ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0; 

nhưng điều này cũng không giúp ích gì. Tôi có thể làm gì để nó hoạt động? Cảm ơn.

+0

Các ClientLogin API đã được gỡ bỏ bởi Google. Nó không được dùng trong 2 năm. Tôi đã điền một vé ([RT # 104767] (https://rt.cpan.org/Ticket/Display.html?id = 104767)), nhưng Net :: Google :: AuthSub không nhận được cập nhật nào trong 5 năm qua ... – dolmen

Trả lời

12

Tôi phải trả lời câu hỏi của mình vì tôi rất vui khi tìm được giải pháp. Google đã thay đổi thuật toán xác thực của họ, vì vậy chúng tôi phải sử dụng OAuth 2.0. Bạn sẽ cần phải tạo Credentials tại địa chỉ: https://console.developers.google.com/

API & auth -> Thông tin đăng nhập -> OAuth -> Client ID -> ứng dụng đã cài đặt -> Khác

và cho phép tức là API của bạn: API & auth -> API -> API Google Apps> Drive API

Các mã sau hoạt động tốt:

use Net::Google::DataAPI::Auth::OAuth2; 
use Net::Google::Spreadsheets; 
use Storable; #to save and restore token for future use 

my $oauth2 = Net::Google::DataAPI::Auth::OAuth2->new(
    client_id => 'ID.apps.googleusercontent.com', 
    client_secret => 'SECRET', 
    scope => ['http://spreadsheets.google.com/feeds/'], 
); 
#you can skip URL if you have your token saved and continue from RESTORE label 

my $url = $oauth2->authorize_url(); 
#you will need to put code here and receive token 
print "OAuth URL, get code: $url\n"; 
use Term::Prompt; 
my $code = prompt('x', 'paste the code: ', '', ''); 
my $token = $oauth2->get_access_token($code) or die; 

#save token for future use 
my $session = $token->session_freeze; 
store($session, 'google_spreadsheet.session'); 

RESTORE: 
my $session = retrieve('google_spreadsheet.session'); 
my $restored_token = Net::OAuth2::AccessToken->session_thaw($session, 
    auto_refresh => 1, 
    profile => $oauth2->oauth2_webserver, 
); 
$oauth2->access_token($restored_token); 

my $service = Net::Google::Spreadsheets->new(auth => $oauth2); 
# and then as before.. 

Lưu và khôi phục thẻ dụ phiên tìm thấy tại https://gist.github.com/hexaddikt

+0

Tuyệt vời, hoạt động như một sự quyến rũ. Cảm ơn rât nhiêu vê nhưng chia sẻ. –

0

Cảm ơn điều này - rất hữu ích. Ngoài ra, mã trong câu trả lời của người đăng ban đầu sẽ tạo một mã thông báo hết hạn sau một giờ. Nếu bạn muốn tiếp tục sử dụng nó, bạn cần phải chắc chắn để xây dựng yêu cầu ban đầu để nó tạo ra không chỉ mã thông báo truy cập, mà còn là mã thông báo làm mới. Để có được điều này, thay đổi ban đầu

my $url = $oauth2->authorize_url(); 

để

my $url = $oauth2->authorize_url(access_type => 'offline', 
           approval_prompt => 'force'); 

Sau đó token trở sẽ có refresh_token cần thiết bao gồm.

+0

Cảm ơn bạn đã nhập. Nhưng tôi đã tạo mã thông báo chỉ một lần và nó đã hơn một tháng và chưa hết hạn. Tôi không chắc nó hoạt động ra sao. –

0

Mã trên hoàn toàn sẽ không hoạt động đối với tôi. Sau khi nhìn xung quanh trong vài giờ, đọc tài liệu và thử những thứ khác nhau cuối cùng tôi đã chạy qua một số mã hoạt động. 90% của nó là như nhau nhưng nó là 10% mất tích và những lời giải thích kèm theo tạo nên tất cả sự khác biệt.

http://pastebin.com/8LeMyLW4

(Nguyên từ Stack Overflow bài đăng này: Authenticating in a Google sheets application)

#!/usr/bin/perl 

# Code to get a web-based token that can be stored 
# and used later to authorize our spreadsheet access. 

# Based on code from https://gist.github.com/hexaddikt/6738162 

#------------------------------------------------------------------- 

# To use this code: 

# 1. Edit the lines below to put in your own 
# client_id and client_secret from Google. 
# 2. Run this script and follow the directions on 
# the screen, which will give step you 
# through the following steps: 
# 3. Copy the URL printed out, and paste 
# the URL in a browser to load the page. 
# 4. On the resulting page, click OK (possibly 
# after being asked to log in to your Google 
# account). 
# 5. You will be redirected to a page that provides 
# a code that you should copy and paste back into the 
# terminal window, so this script can exchange it for 
# an access token from Google, and store the token. 
# That will be the the token the other spreadsheet access 
# code can use. 


use Net::Google::DataAPI::Auth::OAuth2; 
use Net::Google::Spreadsheets; 
use Storable; #to save and restore token for future use 
use Term::Prompt; 

# Provide the filename in which we will store the access 
# token. This file will also need to be readable by the 
# other script that accesses the spreadsheet and parses 
# the contents. 

my $session_filename = "stored_google_access.session"; 


# Code for accessing your Google account. The required client_id 
# and client_secret can be found in your Google Developer's console 
# page, as described in the detailed instruction document. This 
# block of code will also need to appear in the other script that 
# accesses the spreadsheet. 

# Be sure to edit the lines below to fill in your correct client 
# id and client secret! 
my $oauth2 = Net::Google::DataAPI::Auth::OAuth2->new(
    client_id => 'your_client_id.apps.googleusercontent.com', 
    client_secret => 'your_client_secret', 
    scope => ['http://spreadsheets.google.com/feeds/'], 
    redirect_uri => 'https://developers.google.com/oauthplayground', 
          ); 
# We need to set these parameters this way in order to ensure 
# that we get not only an access token, but also a refresh token 
# that can be used to update it as needed. 
my $url = $oauth2->authorize_url(access_type => 'offline', 
       approval_prompt => 'force'); 

# Give the user instructions on what to do: 
print <<END 

The following URL can be used to obtain an access token from 
Google. 

1. Copy the URL and paste it into a browser. 

2. You may be asked to log into your Google account if you 
were not logged in already in that browser. If so, go 
ahead and log in to whatever account you want to have 
access to the Google doc. 

3. On the next page, click "Accept" when asked to grant access. 

4. You will then be redirected to a page with a box in the 
left-hand column labeled "Authorization code". 
Copy the code in that box and come back here. 

Here is the URL to paste in your browser to get the code: 

$url 

END 
    ; 

# Here is where we get the code from the user: 
my $code = prompt('x', 'Paste the code obtained at the above URL here: ', '', ''); 

# Exchange the code for an access token: 
my $token = $oauth2->get_access_token($code) or die; 

# If we get to here, it worked! Report success: 
print "nToken obtained successfully!n"; 
print "Here are the token contents (just FYI):nn"; 
print $token->to_string, "n"; 

# Save the token for future use: 
my $session = $token->session_freeze; 
store($session, $session_filename); 

print <<END2 

Token successfully stored in file $session_filename. 

Use that filename in your spreadsheet-access script to 
load the token as needed for access to the spreadsheet data. 

END2 
    ; 

use Net::Google::Spreadsheets; 
use Net::Google::DataAPI::Auth::OAuth2; 
use Net::OAuth2::AccessToken; 
use Storable; 

# Authentication code based on example from gist at 
# https://gist.github.com/hexaddikt/6738247 

# Get the token that we saved previously in order to authenticate: 
my $session_filename = "stored_google_access.session"; 


# Be sure to edit the lines below to fill in your correct client 
# id and client secret! 
my $oauth2 = Net::Google::DataAPI::Auth::OAuth2->new(
    client_id => 'your_client_id.apps.googleusercontent.com', 
    client_secret => 'your_client_secret', 
    scope => ['http://spreadsheets.google.com/feeds/'], 
    redirect_uri => 'https://developers.google.com/oauthplayground', 
          ); 

# Deserialize the file so we can thaw the session and reuse the refresh token 
my $session = retrieve($sessionfile); 

my $restored_token = Net::OAuth2::AccessToken->session_thaw($session, 
           auto_refresh => 1, 
           profile => $oauth2->oauth2_webserver, 
           ); 

$oauth2->access_token($restored_token); 
# Now we can use this token to access the spreadsheets 
# in our account: 
my $service = Net::Google::Spreadsheets->new(
         auth => $oauth2); 
Các vấn đề liên quan