Python에서 BOX API를 OAuth 인증 한 후 사용하는 샘플

소개



파일 공유 클라우드 서비스 "BOX"의 API를 Python에서 이용하는 샘플을 소개합니다.

API의 사용법 자체는 「BOX」의 문서 시작해, 다양한 사람이 소개해 주고 있습니다만
자신이 하고 싶었던 것에 가까운 정보가 없었기 때문에 기사로 했습니다.

하고 싶었던 일


  • 우선 BOX API를 사용하고 싶습니다
  • mac 터미널에서 실행 (실제로 로컬 JupyterLab에서 실행)
  • OAuth 사용
  • OAuth 리디렉션 결과를 웹 서버에서 수신
  • Python에서 개발

  • htps : // 기주 b. 코 m/보 x/보 x-py 텐-sdk/bぉb/마s r/도 cs/우사게/아우테 ㅇ 치카치온. md
    우선, 이 SDK의 사이트에 실려 있는 다음과 같은 샘플 코드를 바삭하게 움직이고 싶었습니다.
    client = Client(auth)
    user = client.user().get()
    print('User ID is {0}'.format(user.id))
    

    움직이는 것만으로는 수동으로 OAuth의 인증을 통과할 수도 있습니다만, 이번은 OAuth를 간이한 방법으로 실현해 보았습니다.

    환경


    Mac   10.14.6
    Python  3.7.4
    boxsdk  2.6.1 
    

    준비



    박스 SDK 설치



    환경에 맞게 pip 및 기타 도구로 설치하십시오.
    pip install boxsdk
    

    BOX 관리 화면에서 앱 등록











    여기에 표시되는 클라이언트 ID와 클라이언트 기밀 코드를 소스에 복사합니다.

    리디렉션 URI에는 "http://localhost:8080"을 입력하십시오.

    샘플 코드



    sample.py
    from boxsdk import OAuth2, Client
    import webbrowser
    import http.server
    import socketserver
    from urllib.parse import urlparse, parse_qs
    
    # BOXの管理画面から取ってくる
    CLIENT_ID = 'クライアントID'
    CLIENT_SECRET = 'クライアント機密コード'
    
    # BOXの管理画面に設定する
    REDIRECT_URI = 'http://localhost:8080'
    
    HOST = '127.0.0.1'
    PORT = 8080
    
    # BOXが発行する認証コードを入れる変数
    global auth_code
    
    auth_code = None
    
    oauth = OAuth2(
        client_id = CLIENT_ID,
        client_secret = CLIENT_SECRET,
        store_tokens = None     # トークンの保管は今回は省略
    )
    
    # OAuth開始
    auth_url, csrf_token = oauth.get_authorization_url(REDIRECT_URI)
    
    # ブラウザ起動してBOXのIDとパスワードを入力する
    # 入力するとREDIRECT_URIにリダイレクトされる
    webbrowser.open(auth_url)
    
    # REDIRECT_URIが叩かれた時の処理
    class ServerHandler(http.server.SimpleHTTPRequestHandler):
        def do_GET(self):
            global auth_code
            self.send_response(200)
            self.send_header('Content-type', 'text/html')
            self.end_headers()
            self.wfile.write(b"<h1>Authenticated</h1>")
            parsed_path = urlparse(self.path)
            query = parse_qs(parsed_path.query)
            auth_code = query['code'][0]
    
    with socketserver.TCPServer((HOST, PORT), ServerHandler) as server:
        print('http server start')
        # server.serve_forever()    # Ctrl+Cが押されるなどの割り込みがあるまで処理し続ける
        server.handle_request()     # 1回リクエストを処理したら抜ける
        print('http server shutdown')
    
    # auth_codeが取れたので、ここからAPIが使える
    access_token, refresh_token = oauth.authenticate(auth_code)
    
    client = Client(oauth)
    me = client.user().get()
    print('My user ID is {0}'.format(me.id))
    

    실행


  • 실행하면 브라우저가 시작되고 BOX ID 비밀번호 입력 화면이 표시됩니다.
  • 올바른 ID 비밀번호를 입력하면 리디렉션되어 화면에 "Authenticated"가 표시됩니다.
  • 콘솔에 BOX API로 얻은 사용자 ID가 표시됩니다.

    주의점


  • 클라이언트 ID와 클라이언트 기밀 코드는 소스에 직접 쓰여져 있습니다
  • 토큰 보관은 이번에는 생략되었습니다
  • 보안 및 내구성 등은 고려하지 않는다

  • 마지막으로



    JupyterLab에서 실행하고 싶었기 때문에 1 파일에 정리해 썼습니다.

    파이썬으로 간단한 웹 서버를 시작하는 것은 쉽습니다. 이번에는 1 리퀘스트 처리한 것만으로 웹 서버가 종료되는 곳이 마음에 듭니다.

    반대로 do_GET 메소드 안에서 글로벌 변수에 직접 대입하고 있는 것은 마음에 들지 않는 곳입니다. 깨끗한 쓰는 방법 없습니까?

    아마 이상한 움직임은 하고 있지 않다고 생각합니다만, 아직 Python에 자세하지 않기 때문에 이상한 곳이나 개선점이 있으면 지적 받을 수 있으면 다행입니다.

    좋은 웹페이지 즐겨찾기