从Postman为委托范围生成Azure访问令牌

y4ekin9u  于 2023-04-22  发布在  Postman
关注(0)|答案(2)|浏览(129)

我想在我的项目中从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
e0bqpujr

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_idclient_id_exposing_API的值可以不同。

Post: https://login.microsoftonline.com/tenantname.onmicrosoft.com/oauth2/v2.0/token 
Content-Type: application/x-www-form-urlencoded

client_id=xxxx
&scope=api://client_id_exposing_API/.default
&client_secret=sampleCredentia1s
&grant_type=client_credentials

我们可以解码生成的访问令牌,以检查它是否包含roles声明,其中包含您创建的角色。

当使用此令牌但仍然无法调用您的API时,则应该是另一个故事,您可能需要分享您如何配置API应用程序。

ws51t4hk

ws51t4hk2#

注意委托作用域需要使用任意用户交互流(授权码流/隐式流)生成token,应用作用域需要使用客户端凭证流。
我尝试在我的环境中复制相同的内容,并得到如下相同的错误:

如果访问令牌没有足够的权限来执行操作,则通常会发生错误。

要解决错误,请尝试以下操作:

请务必根据您的需求添加API权限

现在,使用下面的端点生成auth-code

https://login.microsoftonline.com/6c3f1c39-b84c-4188-b49f-ca5e806be058/oauth2/v2.0/authorize?
&client_id=b08f06ad-bb74-487b-976a-f8a512d693e0
&response_type=code
&redirect_uri=https://jwt.ms
&response_mode=query
&scope=https://graph.microsoft.com/.default
&state=12345

我使用以下参数生成了访问令牌

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

client_id:ClientID
grant_type:authorization_code
scope:https://graph.microsoft.com/.default
code:code
redirect_uri:https://jwt.ms
client_secret:ClientSecret

当我解码令牌时,scope显示如下:

对于sample,我使用上面生成的访问令牌调用了Graph API,如下所示:

https://graph.microsoft.com/v1.0/users

因此,如果你要公开一个API并添加作用域,它将被委托。你必须使用用户交互流。

如果要代表用户生成访问令牌,请创建应用程序角色并通过客户端凭据流生成令牌。

相关问题