LoginSignup
8

More than 1 year has passed since last update.

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

Posted at

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
  3. You can use dark theme
What you can do with signing up
8