我们正在使用Apigee的client_credentials
OAuth 2授予流程来请求不记名 token 。根据spec:
4.4.2. Access Token Request
The client makes a request to the token endpoint by adding the
following parameters using the "application/x-www-form-urlencoded"
format per Appendix B with a character encoding of UTF-8 in the HTTP
request entity-body:
grant_type
REQUIRED. Value MUST be set to "client_credentials".
但是,如果我们拨打电话,则会收到如下错误:
{"ErrorCode" : "invalid_request", "Error" :"Required param : grant_type"}
看来,使用Apigee,我们必须发送
grant_type
作为查询参数。为什么是这样?由于Apigee处理OAuth 2的方式,我们的Apigee客户无法使用他们选择的语言来使用OAuth库,所以最好知道是否有设计。
此外,它似乎不支持帖子正文中的
grant_type
并使用基本auth发送ID和密钥。 最佳答案
原来,您不需要发送grant_type
作为查询参数。您的GenerateAccessToken策略中有一个<GrantType>
元素,该元素接受一个变量。例如,我可以使用以下代码:
<OAuthV2 name="GenerateAccessToken">
<DisplayName>GenerateAccessToken</DisplayName>
<FaultRules/>
<Properties/>
<!-- This policy generates an OAuth 2.0 access token using the password grant type -->
<Operation>GenerateAccessToken</Operation>
<!-- This is in millseconds -->
<ExpiresIn>1800000</ExpiresIn>
<Attributes/>
<SupportedGrantTypes>
<GrantType>password</GrantType>
</SupportedGrantTypes>
<GenerateResponse enabled="false">
<Format>FORM_PARAM</Format>
</GenerateResponse>
<GrantType>user.grant_type</GrantType>
<UserName>request.header.username</UserName>
<PassWord>request.header.password</PassWord>
</OAuthV2>
在此示例中,
grant_type
作为user.grant_type
传入。但是user.grant_type
可以是任何东西- header ,查询参数,表单参数甚至是硬编码的值。这样,您(开发人员)在如何发送grant_type
方面将获得最大的灵活性。