我想在我的项目中从Postman生成Azure令牌用于API授权。我能够使用下面的API请求生成令牌,但在另一个API请求中使用生成的令牌时收到下面的错误消息。
“此请求的授权被拒绝”
我引用了下面的URL:Azure access token generation from Postman
问题出在生成的令牌上。我试图在www.example.com网站上验证令牌JWT.io。根据发现,我们没有在生成的令牌中添加任何范围。
我目前是具有委托权限的范围。请建议我该怎么做?
终点编号
https://login.microsoftonline.com/:tenant_id/oauth2/token
参数编号
tenant_id:As per id generation by azure.
标题编号
Content-Type: application/x-www-form-urlencoded
主体编号(表单-数据)
grant_type:client_credentials
client_id:As per id generation by azure.
client_secret:As per id generation by azure.
resource:Required URL
回复编号
"token_type": "Bearer",
"expires_in": "foo",
"ext_expires_in": "foo",
"expires_on": "foo",
"not_before": "foo",
"resource": "foo",
"access_token":foo
2条答案
按热度按时间e0bqpujr1#
首先,你有
grant_type:client_credentials
,所以你正在使用client credential flow。这个流程意味着访问令牌将代表应用程序本身生成,因此它不需要用户登录,并且API权限应该是Application
类型。Kiron的答案已经过时了,因为他向你展示的是V1.0流程,所以你有resource:Required URL
,但是我们现在使用的是V2.0流,对于客户端凭证流,其请求参数应该是scope: xxxx/.default
。所以首先你应该按照这一节的内容来公开一个API,我们需要创建一个角色,而不是添加一个作用域,然后你可以去添加API权限,进入Azure AD应用程序-〉API权限刀片-〉添加API权限-〉选择我的API-〉您公开的应用程序API -〉选择应用程序权限-〉您将看到您创建的角色并添加此API权限-〉如果你需要,授予管理员同意。然后你可以看到这样的,这意味着API已经添加和同意。
如果单击此API权限,您将看到类似
api://client_id/role_name
的作用域url。现在,让我们去postman发送这样的请求,作用域必须以
/.default
结束。应用暴露的API和你用来获取认证的API可以不同,所以当你不使用同一个应用时,client_id
和client_id_exposing_API
的值可以不同。我们可以解码生成的访问令牌,以检查它是否包含
roles
声明,其中包含您创建的角色。当使用此令牌但仍然无法调用您的API时,则应该是另一个故事,您可能需要分享您如何配置API应用程序。
ws51t4hk2#
注意:委托作用域需要使用任意用户交互流(授权码流/隐式流)生成token,应用作用域需要使用客户端凭证流。
我尝试在我的环境中复制相同的内容,并得到如下相同的错误:
如果访问令牌没有足够的权限来执行操作,则通常会发生错误。
要解决错误,请尝试以下操作:
请务必根据您的需求添加API权限:
现在,使用下面的端点生成auth-code:
我使用以下参数生成了访问令牌:
当我解码令牌时,scope显示如下:
对于sample,我使用上面生成的访问令牌调用了Graph API,如下所示:
因此,如果你要公开一个API并添加作用域,它将被委托。你必须使用用户交互流。
如果要代表用户生成访问令牌,请创建应用程序角色并通过客户端凭据流生成令牌。