概要
前回 Graph API に入門しました
今回は個人用の OneDrive アクセスしてみます
なそアプリーケーション権限は使えず「委任されたアクセス許可」に変更する必要があるので注意してください
簡単に言うと API をコールするためのアクセストークンを一度ブラウザを開いて取得しなければなりません
環境
- macOS 15.7.1
- Python 3.12.11
サポートされているアカウントの種類
- 任意の組織ディレクトリ内のアカウント (任意の Microsoft Entra ID テナント - マルチテナント) と個人用の Microsoft アカウント (Skype、Xbox など)
もしくは
- 個人用 Microsoft アカウントのみ
権限の設定
- 管理 -> API のアクセス許可 -> アクセス許可の追加 -> Microsoft Graph -> 委任されたアクセス許可
- Files.ReadWrite.All
- Sites.ReadWrite.All
- User.Read
- offline_access
- 既定のディレクトリに管理者の権限を与えますを選択
コールバックURLの設定
- 管理 -> 認証 -> URLの追加 ->
http://localhost:8080
トークンの取得
これは一度だけ実行します
表示された URL にブラウザでアクセスしログインします
- vim ./fetch_token.py
import http.server
import json
import socketserver
import urllib.parse
import webbrowser
import requests
# ======== 設定 ========
TENANT_ID = "xxx"
CLIENT_ID = "xxx"
CLIENT_SECRET = "xxx"
REDIRECT_URI = "http://localhost:8080"
SCOPES = ["Files.ReadWrite.All", "Sites.ReadWrite.All", "User.Read", "offline_access"]
TOKEN_FILE = "onedrive_token.json"
# =======================
def start_local_server():
"""localhostで認可コードを受け取るための簡易HTTPサーバー"""
class Handler(http.server.SimpleHTTPRequestHandler):
def do_GET(self):
query = urllib.parse.urlparse(self.path).query
params = urllib.parse.parse_qs(query)
if "code" in params:
setattr(self.server, "auth_code", params["code"][0])
self.send_response(200)
self.end_headers()
self.wfile.write(b"Authorization successful. You can close this window.")
else:
self.send_response(400)
self.end_headers()
self.wfile.write(b"Missing authorization code.")
with socketserver.TCPServer(("localhost", 8080), Handler) as httpd:
setattr(httpd, "auth_code", None)
print("🌐 ローカルサーバー起動中 (http://localhost:8080)")
httpd.handle_request()
return getattr(httpd, "auth_code", None)
def get_tokens(auth_code):
"""認可コードからトークンを取得"""
token_url = "https://login.microsoftonline.com/consumers/oauth2/v2.0/token"
data = {
"client_id": CLIENT_ID,
"redirect_uri": REDIRECT_URI,
"client_secret": CLIENT_SECRET,
"code": auth_code,
"grant_type": "authorization_code"
}
res = requests.post(token_url, data=data)
res.raise_for_status()
return res.json()
def save_tokens(tokens):
"""トークンをローカルに保存"""
with open(TOKEN_FILE, "w", encoding="utf-8") as f:
json.dump(tokens, f, indent=2)
print(f"💾 トークンを保存しました → {TOKEN_FILE}")
def main():
# 1️⃣ 認可URLを生成
params = {
"client_id": CLIENT_ID,
"response_type": "code",
"redirect_uri": REDIRECT_URI,
"response_mode": "query",
"scope": " ".join(SCOPES)
}
auth_url = f"https://login.microsoftonline.com/consumers/oauth2/v2.0/authorize?{urllib.parse.urlencode(params)}"
print("\n🔗 以下のURLを開いてMicrosoftアカウントでサインインしてください:")
print(auth_url)
webbrowser.open(auth_url)
# 2️⃣ 認可コード受け取り
auth_code = start_local_server()
if not auth_code:
print("❌ 認可コードを取得できませんでした。")
return
print(f"✅ 認可コード取得成功: {auth_code[:20]}...")
# 3️⃣ トークン取得
tokens = get_tokens(auth_code)
print("✅ アクセストークン・リフレッシュトークン取得成功")
save_tokens(tokens)
print("\n🧾 トークン内容:")
print(json.dumps(tokens, indent=2))
if __name__ == "__main__":
main()
動作確認
- pipenv run python ./app.py
でブラウザが開いたらMicrosoft アカウントでログインしアプリに許可を与えます
成功するとトークン情報が onedrive_token.json に保存されるので今後はこれを使って OneDrive にアクセスします
最後に
Python から OneDrive にアクセスするためのトークンの取得まで行いました
次回は実際にファイルのアップロードや取得などを行います
Onedrive for bussiness だとアプリケーションの許可の権限で操作できるようです
0 件のコメント:
コメントを投稿