首页 > 解决方案 > 验证和授权 REST API

问题描述

我在 WSO2 的开发人员门户中创建了一个应用程序,并尝试使用以下 curl 命令生成令牌:

curl -v -X POST -H "Authorization: Basic <base64encoded clientId:clientSecrect>" -k -d "grant_type=password&username=alex&password=alex123&scope=somescope" -H "Content-Type:application/x-www-form-urlencoded" https://localhost:9443/oauth2/token

但我得到以下回复:

180{"error_description":"A valid OAuth client could not be found for client_id: ClientId","error":"invalid_client"} 

我还尝试了以下命令:

curl -v -X POST -H "Authorization: Basic <base64encoded clientId:clientSecrect>" -k -d "grant_type=client_credentials&client_id=&client_secret=" -H "Content-Type:application/x-www-form-urlencoded" https://localhost:9443/oauth2/token

但是没有成功,我可以从 devportal 生成令牌没有问题,但是在执行它时由于某种原因无法识别客户端。有人可以告诉我这可能是什么问题。

标签: wso2wso2-amwso2carbonwso2ei

解决方案


以下是在 devportal 中注册应用程序、生成客户端凭据、生成访问令牌以及使用访问令牌调用 API 调用的完整步骤。请注意,所有这些步骤都是通过 wso2am-3.2.0 devportal REST API 调用实现的。

WSO2 REST API 使用 OAuth2 进行保护,访问控制是通过范围实现的。在开始调用 API 之前,您需要获取具有所需范围的访问令牌。本指南将引导您完成获取访问令牌所需遵循的步骤。首先,您需要通过调用动态客户端注册 (DCR) 端点来获取使用者密钥/秘密密钥对。您可以将首选授权类型添加到有效负载。示例有效负载如下所示。

  {
  "callbackUrl":"www.google.lk",
  "clientName":"rest_api_devportal",
  "owner":"admin",
  "grantType":"client_credentials password refresh_token",
  "saasApp":true
  }

使用上述示例负载创建一个文件 (payload.json),并使用如下所示的 cURL 调用 DCR 端点。此授权标头应包含 base64 编码的管理员用户名和密码。请求的格式

curl -X POST -H "Authorization: Basic Base64(admin_username:admin_password)" -H "Content-Type: application/json" -d @payload.json https://<host>:<servlet_port>/client-registration/v0.17/register

以下是调用上述 curl 后的示例响应。

{
"clientId": "fOCi4vNJ59PpHucC2CAYfYuADdMa",
"clientName": "rest_api_store",
"callBackURL": "www.google.lk",
"clientSecret": "a4FwHlq0iCIKVs2MPIIDnepZnYMa",
"isSaasApplication": true,
"appOwner": "admin",
"jsonString": "{\"grant_types\":\"client_credentials password refresh_token\",\"redirect_uris\":\"www.google.lk\",\"client_name\":\"rest_api_devportal\"}",
"jsonAppAttribute": "{}",
"tokenType": null
}

接下来,您必须使用上述客户端 ID 和密钥来获取访问令牌。我们将为此使用密码授权类型,您可以使用任何您想要的授权类型。您还需要在获取访问令牌时添加适当的范围。devportal REST API 的所有可能范围都可以在本文档的 OAuth2 安全部分中查看,每个资源的范围在资源文档的授权部分中给出。如果您使用密码授权类型,以下是请求的格式。

curl -k -d "grant_type=password&username=<admin_username>&password=<admin_password>&scope=<scopes separated by space>" -H "Authorization: Basic base64(cliet_id:client_secret)" https://<host>:<gateway_port>/token

下面显示的是对上述请求的示例响应。

{
"access_token": "e79bda48-3406-3178-acce-f6e4dbdcbb12",
"refresh_token": "a757795d-e69f-38b8-bd85-9aded677a97c",
"scope": "apim:subscribe apim:api_key",
"token_type": "Bearer",
"expires_in": 3600
}

现在您有了一个有效的访问令牌,您可以使用它来调用 API。浏览 API 描述以找到所需的 API,获取如上所述的访问令牌并使用身份验证标头调用 API。如果您使用不同的身份验证机制,此过程可能会发生变化。

有关详细信息,请参阅https://apim.docs.wso2.com/en/3.2.0/develop/product-apis/devportal-apis/devportal-v1/devportal-v1/#section/Authentication


推荐阅读