Lambda에서 Dropbox 액세스 토큰 얻기
Lambda에서 S3의 이미지를 Dropbox에 업로드에서
액세스 토큰은 콘솔 화면에서 가져왔다.
다만, 유효기간이 4시간밖에 없고 매회 수동으로 취득하고 있었기 때문에 처리에 짜넣었다.
인증 코드 취득
※
token_access_type=offline
를 부여하지 않는 경우,리프레시 토큰을 취득 할 수 없다
https://www.dropbox.com/oauth2/authorize?client_id=(App key)&response_type=code&token_access_type=offline
새로 고침 토큰 획득
※동시에 액세스 토큰도 취득할 수 있지만
기한이 만료되면 사용할 수 없게 되므로 여기에서는 무시한다
curl https://api.dropbox.com/oauth2/token \
-d code=(認証コード) \
-d grant_type=authorization_code \
-u (App key):(App secret)
액세스 토큰 획득
※Lambda에서 리프레시 토큰을 이용하기 전의 확인을 위해
curl https://api.dropbox.com/oauth2/token \
-d grant_type=refresh_token \
-d refresh_token=(リフレッシュトークン) \
-u (App key):(App secret)
구현
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
감상
대부분 콘솔에서 수동으로 액세스 토큰을 받았습니다
Lambda에서 S3의 이미지를 Dropbox Business에 업로드처럼
Dropbox-API-Path-Root 필요
Reference
이 문제에 관하여(Lambda에서 Dropbox 액세스 토큰 얻기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/nkmk1215/items/2b2ed200a1c447655891텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)