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

Python调用Dynamics CRM API获取Refresh Token遇AADSTS65001错误求助

问题分析与解决方法

你遇到的AADSTS65001错误本质是权限授权(consent)不匹配——虽然你在Azure AD后台配置了权限,但offline_access权限的授权没有被正确获取,再加上代码里的scope格式问题,导致请求被拒绝。以下是具体解决步骤:

1. 修正Scope格式问题

你的代码里拼接scope时混用了URL编码(%2f)和明文空格,这会导致Azure AD无法正确解析权限范围。需要统一处理:

  • 授权请求和token请求的scope必须完全一致
  • 直接用/代替%2f,多个scope之间用空格分隔,授权请求时对整个scope字符串做URL编码

修正后的授权请求代码:

import urllib.parse

def login(): 
    # 定义完整权限范围,无需提前编码
    full_scope = f"{scope}/default openid profile offline_access"
    # 对整个scope做URL编码
    encoded_scope = urllib.parse.quote(full_scope)
    authorization_url = (
        f"https://login.microsoftonline.com/{tenant}/oauth2/authorize"
        "?response_type=code"
        f"&client_id={client_id}"
        f"&redirect_uri={redirect_uri}"
        "&response_mode=query&prompt=consent"
        f"&scope={encoded_scope}"
        "&state=12345&sso_reload=true"
        f"&code_challenge={code_challenge}"
        "&code_challenge_method=S256"
        f"&nonce={nonce}"
        "&client_info=1"
        )
    
    return render_template("login.html", version=__version__, auth_uri = authorization_url)

token请求里的scope直接用明文空格分隔即可:

scope = 'https://<myid>.api.crm3.dynamics.com/user_impersonation'
data = {
    'client_id': client_id,
    'scope': f'{scope}/default openid profile offline_access',
    'code': authorization_code,
    'redirect_uri': redirect_uri,
    'grant_type': 'authorization_code',
    'client_secret': client_secret,
    'code_verifier': code_verifier,
}

2. 重新触发交互式授权,确保包含Offline Access

offline_access是委托权限,必须通过用户交互式登录确认授权。即使后台加了权限,之前的授权会话可能没包含这个scope,所以需要:

  • 清理浏览器缓存,或者把授权链接里的prompt=consent改成prompt=login,强制用户重新登录授权
  • 登录时检查授权弹窗的权限列表,确认包含“保持访问权限”(对应offline_access)

3. 检查Azure AD应用权限配置

进入Azure AD应用的API权限页面,确认以下内容:

  • 已添加Microsoft Graph的offline_access委托权限
  • 已添加Dynamics CRM的user_impersonation委托权限
  • 所有添加的权限都已点击授予管理员同意(管理员账号可一次性给所有用户授权,普通用户自行授权即可)

4. 验证其他参数正确性

  • redirect_uri必须和Azure AD应用配置里的完全一致,包括大小写、斜杠等细节
  • PKCE流程中的code_verifier必须和授权请求里的code_challenge对应,不能生成错误
  • 确认tenant参数是正确的租户ID或域名

测试验证

完成修改后重新走登录流程:

  1. 访问登录页跳转到Azure AD授权页,确认权限列表包含“保持访问权限”
  2. 授权后获取authorization_code,再请求token
  3. 成功的话,响应里会包含refresh_token字段,后续可用来刷新access token

内容的提问来源于stack exchange,提问作者Ian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:45:19