我已使用 fastapi-microsoft-identity 使用 Azure EntraID 应用程序注册在 fastapi 上启用身份验证,但需要有关如何使用不记名令牌进行 api 调用的支持。
这里是相同的API代码
from fastapi import APIRouter,Request
from fastapi_microsoft_identity import AuthError,requires_auth,validate_scope
import fastapi
from fastapi.exceptions import HTTPException
from pydantic import ValidationError
from utills.config import AppConfigs
poc_router = APIRouter()
scope = "access_api"
@poc_router.get("/add/{num1}/{num2}")
@requires_auth
async def add_with_auth(request:Request,num1:int,num2:int):
try:
validate_scope(required_scope=scope,request=request)
return num1+num2
except AuthError as ae:
return fastapi.Response(content=ae.error_msg, status_code=ae.status_code)
except ValidationError as ve:
return fastapi.Response(content=ve.error_msg, status_code=ve.status_code)
except Exception as x:
raise HTTPException(status_code=403,detail=f"Failed with Excetion--{e}")
错误:
IDW10201:在不记名令牌中找不到范围或应用程序权限(角色)声明
这是我用来提取 jwt 令牌并传入授权标头的代码,但面临范围问题。
from utills.config import AppConfigs
import subprocess,os,json,requests
def get_ad_token():
curl_cmd = [
"curl",
"-X","post",
f"https://login.microsoftonline.com/{AppConfigs.TENANT_ID}/oauth2/v2.0/token",
"-d", "grant_type=client_credentials",
"-d", f"client_id={AppConfigs.CLIENT_ID}",
"-d", f"client_secret={AppConfigs.CLIENT_SECRET}",
"-d", f"scope=api://{AppConfigs.CLIENT_ID}/.default"
]
res=subprocess.run(curl_cmd,capture_output=True,text=True)
access_token = json.loads(res.stdout)
return access_token["access_token"]
请帮助我获取正确的访问令牌,该令牌可以发送到具有正确范围的 api
当我传递我所定义的范围(即“access_api”)时,微软oauth API仅允许范围/.default,它抱怨范围无效
错误
在不记名令牌中找不到范围或应用程序权限(角色)声明
如果访问令牌不包含任何角色或范围声明,通常会发生。
当您使用客户端凭证流时,您需要授予应用程序类型 API 权限,以便访问令牌包含角色声明。
要解决该错误,请创建如下应用程序角色:
授予管理员同意:
对于示例,我使用以下参数通过 Postman 生成访问令牌:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
client_secret:ClientSecret
grant_type:client_credentials
scope:api://XXX/.default
当我解码令牌时,角色就出现了:
如果您想传递在 Expose an API (即委派权限) 选项卡中创建的范围(如下所示),那么您需要使用交互流来生成访问令牌,以便 scp 声明将出现在令牌中.
参考:
DW10201:在不记名令牌中找不到范围或角色声明。自定义 Web api 核心 - Stack Overflow 作者:Carl Zhu