403-授权错误-OAuth2.0-访问令牌-用于Fhir的Azure Api

403-授权错误-OAuth2.0-访问令牌-用于Fhir的Azure Api,azure,hl7-fhir,fhir-server-for-azure,Azure,Hl7 Fhir,Fhir Server For Azure,我已使用此链接为FHIR部署和配置Azure API- 使用邮递员,我能够成功地将患者信息插入fhir服务器 为了实现自动化,我使用python和客户端服务流 def get_access_token(self): token_url = 'https://login.microsoftonline.com/{}/oauth2/v2.0/token'.format(azure_app_tenant_id) token_data = { '

我已使用此链接为FHIR部署和配置Azure API-

使用邮递员,我能够成功地将患者信息插入fhir服务器

为了实现自动化,我使用python和客户端服务流

   def get_access_token(self):

        token_url = 'https://login.microsoftonline.com/{}/oauth2/v2.0/token'.format(azure_app_tenant_id)

        token_data = {
        'grant_type': 'client_credentials',
        'client_id': azure_app_client_id,
        'client_secret': azure_app_client_secret,
        'scope': fhir_endpoint_url + "/.default",

        }

        token_r = requests.post(token_url, data=token_data)

        log.info("Retrieving Access Token")
        if token_r.status_code == 200:
            log.info("Access Token Retrieved Successfully")
        else:
            raise Exception("Error retrieving access token")

        print(token_r.json()["access_token"])
        return token_r.json()["access_token"]

我可以使用get_access_token获取访问令牌。但是,当我使用access_令牌并插入病历时,其抛出授权失败-403错误

    def insert_patient_record(self, payload):
        log.info("Inserting Patient Record")
        headers = {
            'Authorization': 'Bearer {}'.format(self.get_access_token()),
            'Content-Type': 'application/json'
        }

        response = requests.request("POST", fhir_endpoint_url, headers=headers, data=payload)
        print("Response Code: ", response.status_code)
        if response.status_code == 200:
            log.info("Patient Record inserted Successfully")
        else:
            print("Response Text: ", response.text)
            raise Exception("Error inserting patient record")

注意:在FHIR服务器身份验证部分,我添加了我先前在ADD中创建的已注册应用程序的对象ID

看起来您尚未添加已注册应用程序的(正确)对象id。重要的是,应用程序注册具有对象id,但服务主体也具有对象id。它是您正在寻找的服务主体的应用程序id

检查此处的说明:

您可以在PowerShell的服务主体对象id中找到它:

$(Get-AzureADServicePrincipal -Filter "AppId eq 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'").ObjectId
或Azure CLI:

az广告展示——id XXXXXXXX-XXXX-XXXX-XXXXXXXXXX | jq-r.objectId

我还建议将您的令牌粘贴到类似的内容中,并查看
oid
声明。这是您添加的对象id吗?

我运行了上述命令。。并在Azure API For FHIR->Authentication部分下添加了对象id。通过jwt.ms,我还确认了添加的id和退休令牌中的oid是相同的。但是,我仍然收到身份验证错误。我不确定是什么修复了它。。我删除了所有内容并创建了一个新设置。如上所述添加了Oid,现在可以使用了。我不认为每次都请求acces令牌是个好主意。您知道有没有办法检查访问令牌是否过期或现在过期?令牌响应,即您从中拉出
access\u令牌
字段的对象也有过期时间字段。通常的模式是使用某种缓存,您可以在缓存中查找令牌,如果令牌过期,您可以请求一个新的令牌。你是对的,你不应该每次都买一个新的。
$(Get-AzureADServicePrincipal -Filter "AppId eq 'XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX'").ObjectId