无法使用@requires_auth请求启用fastapi-microsoft-identity的API

问题描述 投票:0回答:1

我已使用 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,它抱怨范围无效

python azure azure-active-directory fastapi microsoft-entra-id
1个回答
0
投票

错误

在不记名令牌中找不到范围或应用程序权限(角色)声明

如果访问令牌不包含任何角色或范围声明,通常会发生。

当您使用客户端凭证流时,您需要授予应用程序类型 API 权限,以便访问令牌包含角色声明。

要解决该错误,请创建如下应用程序角色:

enter image description here

enter image description here

授予管理员同意:

enter image description here

对于示例,我使用以下参数通过 Postman 生成访问令牌:

https://login.microsoftonline.com/TenantID/oauth2/v2.0/token

client_id:ClientID
client_secret:ClientSecret
grant_type:client_credentials
scope:api://XXX/.default

enter image description here

当我解码令牌时,角色就出现了:

enter image description here

如果您想传递在 Expose an API (即委派权限) 选项卡中创建的范围(如下所示),那么您需要使用交互流来生成访问令牌,以便 scp 声明将出现在令牌中.

enter image description here

参考:

DW10201:在不记名令牌中找不到范围或角色声明。自定义 Web api 核心 - Stack Overflow 作者:Carl Zhu

© www.soinside.com 2019 - 2024. All rights reserved.