2013-08-14 55 views
10

Tôi đang tìm một phương pháp khá đơn giản để sử dụng curl để trả về thông tin về một loạt tài khoản người dùng (như createddate hoặc lastlogin) trong google Apps. Tôi rất thiếu kinh nghiệm với curl và ứng dụng của Google Apps.Sử dụng bash curl với oauth để trả về dữ liệu tài khoản người dùng của ứng dụng google?

Có ai biết bài viết giới thiệu hay về cách sử dụng curl với Oauth để yêu cầu dữ liệu tài khoản người dùng không?

Cảm ơn bạn trước!

Trả lời

14

Điều này không dễ dàng đạt được vì OAuth 2.0 và JSON không dễ dàng được Bash xử lý. Có nói rằng, đây là một phiên bản cơ bản sẽ cung cấp cho bạn dữ liệu bạn đang tìm kiếm. Các greps có thể sử dụng một số dọn dẹp nhưng sau đó một lần nữa, giải thích JSON với grep là a really bad idea anyway. Đây là một ví dụ hoàn hảo về lý do tại sao Google API Libraries tồn tại và nên được sử dụng.


# Store our credentials in our home directory with a file called . 
my_creds=~/.`basename $0` 

# create your own client id/secret 
# https://developers.google.com/identity/protocols/OAuth2InstalledApp#creatingcred 
client_id='YOUR OWN CLIENT ID' 
client_secret='YOUR OWN SECRET' 

if [ -s $my_creds ]; then 
    # if we already have a token stored, use it 
    . $my_creds 
    time_now=`date +%s` 
else 
    scope='https://www.googleapis.com/auth/admin.directory.user.readonly' 
    # Form the request URL 
    # https://developers.google.com/identity/protocols/OAuth2InstalledApp#step-2-send-a-request-to-googles-oauth-20-server 
    auth_url="https://accounts.google.com/o/oauth2/v2/auth?client_id=$client_id&scope=$scope&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob" 

    echo "Please go to:" 
    echo 
    echo "$auth_url" 
    echo 
    echo "after accepting, enter the code you are given:" 
    read auth_code 

    # exchange authorization code for access and refresh tokens 
    # https://developers.google.com/identity/protocols/OAuth2InstalledApp#exchange-authorization-code 
    auth_result=$(curl -s "https://www.googleapis.com/oauth2/v4/token" \ 
    -H "Content-Type: application/x-www-form-urlencoded" \ 
    -d code=$auth_code \ 
    -d client_id=$client_id \ 
    -d client_secret=$client_secret \ 
    -d redirect_uri=urn:ietf:wg:oauth:2.0:oob \ 
    -d grant_type=authorization_code) 
    access_token=$(echo -e "$auth_result" | \ 
       grep -Po '"access_token" *: *.*?[^\\]",' | \ 
       awk -F'"' '{ print $4 }') 
    refresh_token=$(echo -e "$auth_result" | \ 
        grep -Po '"refresh_token" *: *.*?[^\\]",*' | \ 
        awk -F'"' '{ print $4 }') 
    expires_in=$(echo -e "$auth_result" | \ 
       grep -Po '"expires_in" *: *.*' | \ 
       awk -F' ' '{ print $3 }' | awk -F',' '{ print $1}') 
    time_now=`date +%s` 
    expires_at=$((time_now + expires_in - 60)) 
    echo -e "access_token=$access_token\nrefresh_token=$refresh_token\nexpires_at=$expires_at" > $my_creds 
fi 

# if our access token is expired, use the refresh token to get a new one 
# https://developers.google.com/identity/protocols/OAuth2InstalledApp#offline 
if [ $time_now -gt $expires_at ]; then 
    refresh_result=$(curl -s "https://www.googleapis.com/oauth2/v4/token" \ 
    -H "Content-Type: application/x-www-form-urlencoded" \ 
    -d refresh_token=$refresh_token \ 
    -d client_id=$client_id \ 
    -d client_secret=$client_secret \ 
    -d grant_type=refresh_token) 
    access_token=$(echo -e "$refresh_result" | \ 
       grep -Po '"access_token" *: *.*?[^\\]",' | \ 
       awk -F'"' '{ print $4 }') 
    expires_in=$(echo -e "$refresh_result" | \ 
       grep -Po '"expires_in" *: *.*' | \ 
       awk -F' ' '{ print $3 }' | awk -F',' '{ print $1 }') 
    time_now=`date +%s` 
    expires_at=$(($time_now + $expires_in - 60)) 
    echo -e "access_token=$access_token\nrefresh_token=$refresh_token\nexpires_at=$expires_at" > $my_creds 
fi 

# call the Directory API list users endpoint, may be multiple pages 
# https://developers.google.com/admin-sdk/directory/v1/reference/users/list 
while : 
do 
    api_data=$(curl -s --get https://www.googleapis.com/admin/directory/v1/users \ 
    -d customer=my_customer \ 
    -d prettyPrint=true \ 
    `if [ -n "$next_page" ]; then echo "-d pageToken=$next_page"; fi` \ 
    -d maxResults=500 \ 
    -d "fields=users(primaryEmail,creationTime,lastLoginTime),nextPageToken" \ 
    -H "Content-Type: application/json" \ 
    -H "Authorization: Bearer $access_token") 
    echo -e "$api_data" | grep -v 'nextPageToken' 
    next_page=$(echo $api_data | \ 
    grep -Po '"nextPageToken" *: *.*?[^\\]"' | \ 
    awk -F'"' '{ print $4 }') 
    if [ -z "$next_page" ] 
    then 
    break 
    fi 
done 
+0

Cảm ơn bạn, điều này sẽ giúp tôi cho đến khi tôi có thể dành vài ngày lặn sâu vào đất trăn hoặc java. –

+1

grep có thể được thay thế trong tập lệnh của bạn bằng 'jq'. Mặc dù không thay thế thả, 'jq' là một chương trình tiện ích trên Linux có khả năng phân tích cú pháp một tệp có định dạng JSON và kéo ra các trường, tức là' access_token = $ (jq ".access_token" ./cachedCredentials.json) ' – Paul

3

Cảm ơn bạn Jay Lee, tôi muốn chia sẻ một kịch bản được sửa đổi để truy cập UserInfo thường xuyên (không có ứng dụng google). Chỉ cần nhớ bật API Google+ trên bảng điều khiển API của Google:

# Store our credentials in our home directory with a file called .<script name> 
my_creds=~/.`basename $0` 
client_id='********PUT YOURS**********.apps.googleusercontent.com' 
client_secret='' # not really a secret 
if [ -s $my_creds ]; then 
    # if we already have a token stored, use it 
    . $my_creds 
    time_now=`date +%s` 
else 
    scope='profile' 
    # Form the request URL 
    # http://goo.gl/U0uKEb 
    auth_url="https://accounts.google.com/o/oauth2/auth?client_id=$client_id&scope=$scope&response_type=code&redirect_uri=urn:ietf:wg:oauth:2.0:oob" 

    echo "Please go to:" 
    echo 
    echo "$auth_url" 
    echo 
    echo "after accepting, enter the code you are given:" 
    read auth_code 

    # swap authorization code for access and refresh tokens 
    # http://goo.gl/Mu9E5J 
    auth_result=$(curl -s https://accounts.google.com/o/oauth2/token \ 
    -H "Content-Type: application/x-www-form-urlencoded" \ 
    -d code=$auth_code \ 
    -d client_id=$client_id \ 
    -d client_secret=$client_secret \ 
    -d redirect_uri=urn:ietf:wg:oauth:2.0:oob \ 
    -d grant_type=authorization_code) 
    access_token=$(echo -e "$auth_result" | \ 
       grep -Po '"access_token" *: *.*?[^\\]",' | \ 
       awk -F'"' '{ print $4 }') 
    refresh_token=$(echo -e "$auth_result" | \ 
        grep -Po '"refresh_token" *: *.*?[^\\]",*' | \ 
        awk -F'"' '{ print $4 }') 
    expires_in=$(echo -e "$auth_result" | \ 
       grep -Po '"expires_in" *: *.*' | \ 
       awk -F' ' '{ print $3 }' | awk -F',' '{ print $1}') 
    time_now=`date +%s` 
    expires_at=$((time_now + expires_in - 60)) 
    echo -e "access_token=$access_token\nrefresh_token=$refresh_token\nexpires_at=$expires_at" > $my_creds 
fi 

# if our access token is expired, use the refresh token to get a new one 
# http://goo.gl/71rN6V 
if [ $time_now -gt $expires_at ]; then 
    refresh_result=$(curl -s https://accounts.google.com/o/oauth2/token \ 
    -H "Content-Type: application/x-www-form-urlencoded" \ 
    -d refresh_token=$refresh_token \ 
    -d client_id=$client_id \ 
    -d client_secret=$client_secret \ 
    -d grant_type=refresh_token) 
    access_token=$(echo -e "$refresh_result" | \ 
       grep -Po '"access_token" *: *.*?[^\\]",' | \ 
       awk -F'"' '{ print $4 }') 
    expires_in=$(echo -e "$refresh_result" | \ 
       grep -Po '"expires_in" *: *.*' | \ 
       awk -F' ' '{ print $3 }' | awk -F',' '{ print $1 }') 
    time_now=`date +%s` 
    expires_at=$(($time_now + $expires_in - 60)) 
    echo -e "access_token=$access_token\nrefresh_token=$refresh_token\nexpires_at=$expires_at" > $my_creds 
fi 

# call the Directory API list users endpoint, may be multiple pages 
# http://goo.gl/k0jnQJ 
    api_data=$(curl -s --get https://www.googleapis.com/plus/v1/people/me \ 
    -d prettyPrint=true \ 
    -H "Content-Type: application/json" \ 
    -H "Authorization: Bearer $access_token") 
    echo -e "$api_data"