使用django-microsoft-auth的Django项目如何调用Microsoft Graph API获取登录用户头像
解决方案
1. 获取用户的Microsoft访问令牌
django-microsoft-auth会为每个通过Microsoft登录的用户创建MicrosoftAccount实例,关联到Django的User模型。你可以直接通过当前登录用户获取该实例,进而拿到访问令牌:
from microsoft_auth.models import MicrosoftAccount # 从request中获取当前登录用户 if request.user.is_authenticated: try: microsoft_account = MicrosoftAccount.objects.get(user=request.user) access_token = microsoft_account.access_token except MicrosoftAccount.DoesNotExist: # 用户未通过Microsoft登录,处理该情况 access_token = None
2. 调用Graph API获取头像并转Base64
拿到令牌后,发送请求到头像接口,将返回的二进制图片数据编码为Base64格式:
import requests import base64 def get_user_avatar(access_token): if not access_token: return None api_url = "https://graph.microsoft.com/v1.0/me/photo/$value" headers = {"Authorization": f"Bearer {access_token}"} response = requests.get(api_url, headers=headers) if response.status_code == 200: # 编码为Base64并生成可直接在HTML中使用的Data URI base64_data = base64.b64encode(response.content).decode('utf-8') return f"data:image/jpeg;base64,{base64_data}" else: # 请求失败,返回默认头像或None return None
3. 用上下文处理器传递头像到模板
创建上下文处理器,让所有模板都能访问用户头像:
- 在你的应用目录下新建
context_processors.py,添加以下代码:
from .utils import get_user_avatar from microsoft_auth.models import MicrosoftAccount def user_avatar(request): avatar_data = None if request.user.is_authenticated: try: ms_account = MicrosoftAccount.objects.get(user=request.user) avatar_data = get_user_avatar(ms_account.access_token) except MicrosoftAccount.DoesNotExist: pass return {"user_avatar": avatar_data}
- 在
settings.py中注册这个上下文处理器:
TEMPLATES = [ { # ... 其他配置 "OPTIONS": { "context_processors": [ # ... 已有的处理器 "your_app.context_processors.user_avatar", # 替换为你的应用名称 ], }, }, ]
4. 在base.html中展示头像
在模板中直接使用user_avatar变量渲染图片:
{% if user_avatar %} <img src="{{ user_avatar }}" alt="用户头像" /> {% else %} <img src="/static/images/default-avatar.jpg" alt="默认头像" /> {% endif %}
关键注意事项
- 确保你的Microsoft应用已配置
User.Read权限,django-microsoft-auth默认包含该权限,若未配置,需在Azure门户中添加,并更新项目的settings.py:MICROSOFT_AUTH_SCOPES = ["user.read"] - 访问令牌过期时,django-microsoft-auth会自动刷新(若存在刷新令牌),无需手动处理;若遇到401错误,可检查令牌刷新逻辑是否正常。
内容的提问来源于stack exchange,提问作者Nicholas Ewing
相关产品推荐
相关产品推荐

