Lambda에서 Dropbox 액세스 토큰 얻기

13305 단어 DropboxAWS
Lambda에서 Dropbox 액세스 토큰을 받았을 때의 개인 메모

Lambda에서 S3의 이미지를 Dropbox에 업로드에서
액세스 토큰은 콘솔 화면에서 가져왔다.
다만, 유효기간이 4시간밖에 없고 매회 수동으로 취득하고 있었기 때문에 처리에 짜넣었다.

인증 코드 취득


  • 앱 키를 콘솔 화면에서 가져 오기


  • 아래 URL에 브라우저에서 액세스
    token_access_type=offline를 부여하지 않는 경우,
    리프레시 토큰을 취득 할 수 없다
  • https://www.dropbox.com/oauth2/authorize?client_id=(App key)&response_type=code&token_access_type=offline
    
  • "다음"을 누르십시오


  • "개인"을 누르십시오


  • 인증 코드 얻기



  • 새로 고침 토큰 획득


  • 콘솔 화면에서 App secret를 가져옵니다


  • 획득 한 인증 코드를 사용하여 CloudShell에서 curl 명령 실행
    ※동시에 액세스 토큰도 취득할 수 있지만
    기한이 만료되면 사용할 수 없게 되므로 여기에서는 무시한다
  • curl https://api.dropbox.com/oauth2/token \
        -d code=(認証コード) \
        -d grant_type=authorization_code \
        -u (App key):(App secret)
    
  • 새로 고침 토큰 얻기



  • 액세스 토큰 획득


  • 검색된 새로 고침 토큰을 사용하여 CloudShell에서 curl 명령 실행
    ※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
    

    감상


  • 참고 정보가 적었다.
  • 2021 년 9 월 30 일까지 장기 액세스 토큰을 사용할 수 있기 때문에
    대부분 콘솔에서 수동으로 액세스 토큰을 받았습니다
  • .
  • 리디렉션을 포함한 여러 앱 개발

  • Dropbox Business에서도 비슷한 방식으로 작동하는지 확인

  • Lambda에서 S3의 이미지를 Dropbox Business에 업로드처럼
    Dropbox-API-Path-Root 필요

  • 좋은 웹페이지 즐겨찾기