search
LoginSignup
6

More than 1 year has passed since last update.

posted at

LambdaでDropboxのアクセストークンを取得する

LambdaでDropboxのアクセストークンを取得したときの個人メモ

LambdaでS3にある画像をDropboxにアップロードするでは
アクセストークンはコンソール画面から取得していた。
ただ、有効期間が4時間しかなく毎回手動で取得していたため処理に組み込んだ。


認証コード取得

  • App keyをコンソール画面から取得

000.JPG

  • 以下URLにブラウザからアクセス
     ※token_access_type=offlineを付与しない場合、
      リフレッシュトークンが取得できない
https://www.dropbox.com/oauth2/authorize?client_id=(App key)&response_type=code&token_access_type=offline
  • 「次へ」を押下

001.JPG

  • 「個人」を押下

002.JPG

  • 認証コードを取得

003.JPG

リフレッシュトークン取得

  • App secretをコンソール画面から取得

004.JPG

  • 取得した認証コードを利用してCloudShellにてcurlコマンド実行
     ※同時にアクセストークンも取得できるが
      期限が切れると使えなくなるのでここでは無視する
curl https://api.dropbox.com/oauth2/token \
    -d code=(認証コード) \
    -d grant_type=authorization_code \
    -u (App key):(App secret)
  • リフレッシュトークンを取得

005.JPG

アクセストークン取得

  • 取得したリフレッシュトークンを利用してCloudShellにてcurlコマンド実行
     ※Lambdaでリフレッシュトークンを利用する前の確認のため
curl https://api.dropbox.com/oauth2/token \
    -d grant_type=refresh_token \
    -d refresh_token=(リフレッシュトークン) \
    -u (App key):(App secret)
  • アクセストークンを取得できることを確認

006.JPG

実装

  • get_token()にてアクセストークンを取得、後続処理に利用
lambda_function.py
import os
import logging
import boto3
import base64
import requests
import json

# ログ設定
logger = logging.getLogger(__name__)
logger.setLevel(os.environ['LOG_LEVEL'])

# S3設定
S3_BUCKET = '(バケット名)'

# Dropbox設定
APP_KEY = '(App key)'
APP_SECRET = '(App secret)'
REFRESH_TOKEN = '(リフレッシュトークン)'

# 画像ファイル情報
FOLDER_PATH = "image/"
FILE_NAME = 'escle.png'


# リフレッシュトークンからアクセストークンを取得する
# return:アクセストークン
def get_token():
    logger.debug('start get_token()')

    data = {
      'grant_type': 'refresh_token',
      'refresh_token': REFRESH_TOKEN
    }

    response = requests.post('https://api.dropbox.com/oauth2/token', data=data, auth=(APP_KEY, APP_SECRET))
    logger.info('response:' + json.dumps(response.json(),default=str))

    access_token = response.json()['access_token']
    logger.debug('access_token:' + access_token)

    logger.debug('end get_token()')

    return access_token


# S3から指定したバケット、フォルダ、ファイル名の画像を取得する
# 取得できる画像サイズはLambdaのメモリーに依存
# return:画像のバイナリデータ
def get_img_from_s3():
    logger.debug('start get_img_from_s3()')

    s3 = boto3.client('s3')
    bucket_name = S3_BUCKET
    file_path = FOLDER_PATH + FILE_NAME
    response = s3.get_object(Bucket=bucket_name, Key=file_path)
    body = response['Body'].read()

    logger.debug('end get_img_from_s3()')

    return body


# 画像をDropboxにアップロードする
# img:画像のバイナリデータ
# return:アップロード結果
def upload_to_dropbox(access_token, img):
    logger.debug('start upload_to_dropbox()')

    arg = '{"path": "' + '/' + FOLDER_PATH + FILE_NAME + '","mode": "add","autorename": true,"mute": false,"strict_conflict": false}'

    headers = {
        'Authorization': 'Bearer ' + access_token,
        'Dropbox-API-Arg': arg.encode("utf_8"),
        'Content-Type': 'application/octet-stream',
    }

    response = requests.post('https://content.dropboxapi.com/2/files/upload', headers=headers, data=img)
    logger.info('response:' + json.dumps(response.json(),default=str))

    logger.debug('end upload_to_dropbox()')

    return json.dumps(response,default=str)


def lambda_handler(event, context):
    logger.debug('start lambda_handler()')

    img = get_img_from_s3()
    access_token = get_token()
    result = upload_to_dropbox(access_token, img)

    logger.debug('end lambda_handler()')

    return result

感想

  • 参考情報が少なかった
    • 2021年9月30日までは長期のアクセストークンが利用できるため
      ほとんどがコンソールから手動でアクセストークンを取得していた
    • リダイレクトを含むアプリ開発はいくつかあった
  • Dropbox Businessでも同様に動作することを確認

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
6