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或域名
测试验证
完成修改后重新走登录流程:
- 访问登录页跳转到Azure AD授权页,确认权限列表包含“保持访问权限”
- 授权后获取authorization_code,再请求token
- 成功的话,响应里会包含
refresh_token字段,后续可用来刷新access token
内容的提问来源于stack exchange,提问作者Ian
相关产品推荐
相关产品推荐

