You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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. 用上下文处理器传递头像到模板

创建上下文处理器,让所有模板都能访问用户头像:

  1. 在你的应用目录下新建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}
  1. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 14:03:15