我需要进行以下POST调用。但是,即使我提供了正确的客户端ID和密码ID,我的电话也会被拒绝。
curl POST https://login.microsoftonline.com/f02....e3/oauth2/token
-H 'Content-Type: application/x-www-form-urlencoded' --data 'grant_type=authorization_code&redirect_uri=https://requestb.in/ac&
source=https://graph.microsoft.com&client_id=1e1....-913d9
&client_secret=YmbSFYz.....4Uk=&scope=mail.read&code=AaAAA........on0a569'
这是我收到的错误:
curl: (6) Could not resolve host: POST
{"error":"invalid_client","error_description":"AADSTS70002:
Error validating credentials. AADSTS50012: Invalid client secret is
provided.\r\nTrace ID: 78d...a2b\r\nCorrelation ID:
01....ab2\r\nTimestamp: 2016-12-14 01:46:47Z","error_codes":[70002,50012],"timestamp":"2016-12-14 01:46:47Z","trace_id":"78d....a2b","correlation_id":"018.....ab2"}
我该如何解决这个问题?
编辑:我正试图在this documentation
中实现第二部分(即获取令牌)答案 0 :(得分:5)
您提供的帖子是利用AAD V2端点。但根据您的代码段,您使用的是V1端点https://login.microsoftonline.com/f02....e3/oauth2/token
。对于通过V1端点获取访问令牌,您可以参考https://graph.microsoft.io/en-us/docs/authorization/app_authorization了解更多详细信息。
对于V2授权端点,您可以查看您正在使用的端点:
GET https://login.microsoftonline.com/common/oauth2/v2.0/authorize?...
POST https://login.microsoftonline.com/common/oauth2/v2.0/token
此外,它还需要v2.0广告应用程序:
本文假设v2.0注册,因此您将在Application Registration Portal上注册您的应用。
答案 1 :(得分:4)
这是由于client_secret。它可能包含特殊字符。
encodeURIComponent()
函数对URI组件进行编码。
此功能对特殊字符进行编码。另外,它编码以下字符:,/? :@& = + $#
使用以下内容:
encodeURIComponent(client_secret);
答案 2 :(得分:1)
我正在使用npm包:
Microsoft Azure Active Directory Passport.js Plug-In
使用v1特定于租户的端点。
成功登录Microsoft后,我最初收到相同的错误消息:" Invalid Client Secret"。
我正在使用"应用程序ID"作为客户秘密。然后我发现你需要进入"设置" Microsoft Azure门户中的选项卡
并创建一个新的" Key"。密钥的名称并不重要。当您单击"保存"按钮,键的值将填入Web表单。立即复制,因为如果刷新网页,它将不会再次显示。
这是"客户端密码"您需要添加到配置中。
答案 3 :(得分:0)
我今天遇到了同样的问题,在@muthu的帮助下,我将其解决了。 使用天蓝色的应用程序注册生成客户端机密时。秘密很明显。但是,在其余调用中何时使用它,则必须对其进行urlencode。 使用视觉代码等编码器。但是必须对其进行编码,否则会产生错误
AADSTS7000215:提供了无效的客户机密码。
答案 4 :(得分:0)
您需要在POST正文中对client_secret进行64位编码。
例如(使用curl):
# Authn details
LoginURL='https://login.microsoftonline.com'
TenantDomain='********.onmicrosoft.com'
ClientID='********'
ClientSecret='********'
# Endpoint details
Resource='https://graph.microsoft.com'
TenantGUID="********"
# Authenticate with OAuth v1
URL="$LoginURL/$TenantDomain/oauth2/token?api-version=1.0"
json=`
curl \
-s \
-k \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-u "$ClientID:$ClientSecret" \
-d "grant_type=client_credentials" \
-d "resource=$Resource" \
-d "client_id=$ClientID" \
--data-urlencode "client_secret=$ClientSecret" \
$URL \
| python -m json.tool
`
access_token=`echo $json | python -c 'import sys, json; print json.load(sys.stdin)["access_token"]'`
token_type=`echo $json | python -c 'import sys, json; print json.load(sys.stdin)["token_type"]'`
#echo "access_token:$access_token"
#echo "token_type:$token_type:"
# Access resource
URL="$Resource/v1.0/directoryRoles/$TenantGUID/members"
curl \
-s \
-k \
-X GET \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: $token_type $access_token" \
$URL \
| python -m json.tool
答案 5 :(得分:0)
就我而言: 在配置中,您必须使用客户端机密“值”,而不是 ID。 此值仅在生成时可见。所以你现在可以复制/粘贴它。