Azure Video Indexer API视频模糊处理完成后查询作业状态返回USER_NOT_ALLOWED错误
问题现象
我在用Python调用Azure Video Indexer API处理视频(索引+模糊)时,碰到了一个奇怪的问题:索引和模糊过程中查询状态都能拿到正常响应,但一旦模糊进度到100%完成后,再请求状态查询的Location URL就会返回权限错误:
{ "ErrorType": "USER_NOT_ALLOWED", "Message": "User has no permission on account" }
我的访问令牌是用Contributor权限、账户范围生成的,本来想着Contributor权限应该足够覆盖所有操作,而且已经给账户加了能想到的所有相关IAM权限,但还是没解决这个问题。
我的最终目标是下载模糊处理后的视频,但现在连状态都查不了,更别说获取下载链接了。
作业状态查询URL格式
我用来查模糊作业状态的URL格式如下:
https://api.videoindexer.ai/{self.location}/Accounts/{self.account_id}/Videos/{video_id}/redact/?accessToken={self.access_token}&name={name}
当前使用的查询代码
下面是我用来查询状态的Python代码,在进度到100%之前完全正常:
def get_video_blurring_processing_status(self, job_url): try: # Append the access token to the job URL url_with_token = f"{job_url}?accessToken={self.access_token}" # Send the request to the job status endpoint response = requests.get(url_with_token) if response.status_code == 200: data = response.json() processing_progress = data.get("progress", "Unknown") state = data.get("state", "Unknown") return {"processing_progress": processing_progress, "state": state} else: # Temporary hack # return {"processing_progress": 100, "state": "Succeeded"} print(f"Failed to get job status. Status Code: {response.status_code}, Response: {response.content}") return None except Exception as e: print(f"Error while checking blurring status: {e}") return None
我已经尝试过的方案
- 确认了访问令牌确实是Contributor权限、账户范围
- 验证了这个令牌在其他API调用(比如视频索引状态查询,进度到100%前)都能正常工作
- 多次重新生成访问令牌,结果还是一样
可能的解决建议
根据我和其他开发者碰到的类似情况,给你几个排查方向:
切换到Account Admin权限的令牌
Contributor权限虽然看起来覆盖了大部分操作,但视频模糊完成后的资源访问可能需要更明确的管理权限。试试生成一个带Account Admin权限的令牌(生成时权限选AccountAdmin,范围保持Account),再测试状态查询和下载请求,这是我之前解决类似问题的核心方案。直接调用下载接口绕开状态查询
既然你已经知道模糊作业到100%了,能不能直接尝试调用下载接口?下载模糊后视频的接口格式大概是:https://api.videoindexer.ai/{location}/Accounts/{account_id}/Videos/{video_id}/SourceFile/DownloadRedactedVideo?accessToken={token}直接请求这个URL试试,说不定能跳过状态查询的权限问题,直接拿到视频文件。
核对IAM角色的分配范围
你给账户加了Contributor权限,确认下角色分配的范围是整个Video Indexer账户,而不是某个特定的视频或者上级资源组?有时候范围设置过窄,会导致后期操作权限不足。再次确认令牌生成参数
虽然你重新生成过令牌,但再核对下生成令牌的API调用参数,确保scope参数确实是Account——偶尔会因为代码参数拼写错误,实际生效的是视频级别的范围,导致完成后的操作权限不够。
总结
这个问题大概率是Azure Video Indexer对不同阶段操作的权限细分要求导致的,先试试用Account Admin令牌或者直接调用下载接口,应该能解决你的核心需求。
备注:内容来源于stack exchange,提问作者Einstein EBEREONWU

