检索到 Cloud Foundry OAuth 令牌,但在发布到 REST API 时得到 {"error":"Not authorized"}
Cloud Foundry OAuth token retrieved but get {"error":"Not authorized"} when POSTing to REST API
SAP 云平台使用 Cloud Foundry 来容纳它的一些服务,例如 HyperLedger 等
如果我手动执行以下操作:
我在 https://login.cf.us10.hana.ondemand.com/login
使用有效的用户名/密码登录到一个 cloud foundry 实例
然后将我重定向到另一个主机 "blockchain-cockpit.cfapps.us10.hana.ondemand.com",在那里我可以通过网页上提供的 "cockpit" 成功调用有问题的 RESTful API。
我的目标是能够使用 OAuth 令牌在 "blockchain-cockpit.cfapps.us10.hana.ondemand.com" 上调用 RESTful 服务。
所以我转到命令行使用以下命令获取 OAuth 令牌:
curl -v -XPOST -H "Application/json" -u "cf:" --data "username=<username>&password=<password>&client_id=cf&grant_type=password&response_type=token" https://login.cf.us10.hana.ondemand.com/oauth/token
这很高兴地向我传回了 * 似乎是有效的令牌。
例如:
{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImtleS0xIiwidHlwIjoiSldUIn0.eyJqdGkiOiJmZTY1NjYyOTM3YTk0Nzc0YTUyYmM5MzRiYzU5MjRjOCIsInN1YiI6ImMxYzcyZTcyLWI3OGUtNDAyYy1iZTBjLWQ3MDUyNzYzZmZmYiIsInNjb3BlIjpbIm9wZW5pZCIsInVhYS51c2VyIiwiY2xvdWRfY29udHJvbGxlci5yZWFkIiwicGFzc3dvcmQud3JpdGUiLCJjbG91ZF9jb250cm9sbGVyLndyaXRlIl0sImNsaWVudF9pZCI6ImNmIiwiY2lkIjoiY2YiLCJhenAiOiJjZiIsImdyYW50X3R5cGUiOiJwYXNzd29yZCIsInVzZXJfaWQiOiJjMWM3MmU3Mi1iNzhlLTQwMmMtYmUwYy1kNzA1Mjc2M2ZmZmIiLCJvcmlnaW4iOiJsZGFwIiwidXNlcl9uYW1lIjoia2V2aW5AZXJwZ2VuaWUuY29tIiwiZW1haWwiOiJrZXZpbkBlcnBnZW5pZS5jb20iLCJhdXRoX3RpbWUiOjE1MTU4NzE4NTgsInJldl9zaWciOiI2YzIwMjc2YyIsImlhdCI6MTUxNTg3MTg1OCwiZXhwIjoxNTE1ODcyNDU4LCJpc3MiOiJodHRwczovL3VhYS5jZi51czEwLmhhbmEub25kZW1hbmQuY29tL29hdXRoL3Rva2VuIiwiemlkIjoidWFhIiwiYXVkIjpbImNsb3VkX2NvbnRyb2xsZXIiLCJwYXNzd29yZCIsImNmIiwidWFhIiwib3BlbmlkIl19.WgYaTeDqGcJfOpidmTLi06tJnDTC8eGigyWAaEsfDkRmOEWWJhK48dJVjZ43yCh_aECgKq__SUq7kLc48_yWRQ7fjDQSLPXRoZu-4X1YvVB-Xi68PnYAOTtnJFN_F7e6E43mLLNA5_5CdXJ8n88__sJXEoDknrI2R8inmolwIm8AtlvZlh_kuFtF5zt6_RudWkheP8GH8cDBXEEolj0jZtONrJ7bs88E_M07Rgo-fXSdOa6bPMGBCiGPWHqSfLsXGgSaFgeNkBu9_MygAcjx3v3QsQissHfORgzixTCVxT0fyWvoLyc-aWM-NrUzSZNq1hl33l99-QDFWq8sTplSh1Gz1G9y9eJEcH3KI_ycR7FRPmJ4l7eIEjXJm-0r05wqKKwnu8rdkX5hrv55-7qqaM_K32Pug6Sb_lBKfuccz_X7bHWtV7IbybiX_-jU2-CljDAZb6DNl9iTkHhSSKcIODpbItM5BD_AiOuCO8RviuD-P142sjwOD-1dQ9YhsvzQ66UZMjt05FNT7_SaYaxU_i5F6IBXFBmY-zFioIMdJyehGatgaxylqvjS_C_xv0Q7cLW_vsJvlv14AWnBhjD_-KO6oUoGN-llxRK8bo-a56ssfz2eBgNJjjroNw1nAqWU4cFmsOgD3Jni3wIpjBSGzh-ogdx63LCK60DVBu5y1NE","token_type":"bearer","refresh_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImtleS0xIiwidHlwIjoiSldUIn0.eyJqdGkiOiIzZmIxOWQ5NWU3ODY0ZWZhOTE2NTM4NzE3ZjM1YzAxMi1yIiwic3ViIjoiYzFjNzJlNzItYjc4ZS00MDJjLWJlMGMtZDcwNTI3NjNmZmZiIiwic2NvcGUiOlsib3BlbmlkIiwidWFhLnVzZXIiLCJjbG91ZF9jb250cm9sbGVyLnJlYWQiLCJwYXNzd29yZC53cml0ZSIsImNsb3VkX2NvbnRyb2xsZXIud3JpdGUiXSwiaWF0IjoxNTE1ODcxODU4LCJleHAiOjE1MTg0NjM4NTgsImNpZCI6ImNmIiwiY2xpZW50X2lkIjoiY2YiLCJpc3MiOiJodHRwczovL3VhYS5jZi51czEwLmhhbmEub25kZW1hbmQuY29tL29hdXRoL3Rva2VuIiwiemlkIjoidWFhIiwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwidXNlcl9uYW1lIjoia2V2aW5AZXJwZ2VuaWUuY29tIiwib3JpZ2luIjoibGRhcCIsInVzZXJfaWQiOiJjMWM3MmU3Mi1iNzhlLTQwMmMtYmUwYy1kNzA1Mjc2M2ZmZmIiLCJyZXZfc2lnIjoiNmMyMDI3NmMiLCJhdWQiOlsiY2xvdWRfY29udHJvbGxlciIsInBhc3N3b3JkIiwiY2YiLCJ1YWEiLCJvcGVuaWQiXX0.SsG45uw8qhSU1ulJ54QZdX8bNnykgGXUwzklBme4sjpNjLd2BuJbW0PHBY7_bHbNiPXplqVGSHsIixaUu-QYqFzs2ebjaGRfBeb9ElwPymI7PRak2gGbw6W1lwHLRpYtIQDp5Ezl9Exj9H_4YW8x7WV4Ca2zRhA8BxayKN7yqSdObR7FVNH0o6-8ZtYcpsHVNKu8KCWCkZ4kEBj4jAHrPmH7FV1AQMSTBK8P-iTWmDbWvsaa0RKxkfveCie_ESgAFt-Y8ZO3mu3zqNCxD238fQc3GJvpE2TPbaAAaSCcTRLBVWLFCiV-2VpmY7Fmv4R80RnzMkV1vOrkNutHNc4NYi3
dYf7JNRJ60Nox1jQRqoMuAS_VSGTiHAnLoOPVf7s0Y09wKuIeVwfB2UHFhs7UtKM7egJGKeZFAOcHAZNL8qbyqkRi0bkOOEMD0mqvEvMHEeS1o5KmYQ7zrxyNgQJgwJ98zMgOzHmC3NQ8o_sNZKTurxNqaPFsbmoB2tCoI9AkfaVdeDOd8tiY6XBAu5h76O7pag9RV4ch_nmViAPYwpD_ZxvwhB_3X0oqSKKNKzZaLW9ONip7yBmMhCub48D_zT26bOKUIYenO1LAV5aHjufsut7YxWBadrPSpGF-Oz6VYYeDqCerf7F8-rdA-RZYGUQBK-weTLJAfbQPn6CgTO4","expires_in":599,"scope":"openid
uaa.user cloud_controller.read password.write
cloud_controller.write","jti":"fe65662937a94774a52bc934bc5924c8"}*
Connection #0 to host login.cf.us10.hana.ondemand.com left intact
假设我现在有一个有效的令牌然后我尝试POST使用POSTMAN并设置HTTP header:
授权:Bearer #token from above#
如前所述,我 POST 正在 "blockchain-cockpit.cfapps.us10.hana.ondemand.com" 而不是我从中获得令牌的主机,因此不确定这是否是这里的主要问题。
PostMan 一直给我这个错误
{
"error": "Not authorized" }
然后我使用 CURL 使用以下命令尝试相同的操作:
curl -H "Authorization: Bearer <token>" -X POST https://blockchain-cockpit.cfapps.us10.hana.ondemand.com/<remaining rest api> --data "test data"
我遇到了完全相同的问题:
{"error":"Not authorized"}
所以我的问题是,如果我手动登录并与站点上的 api 交互,它会完美运行,但是当我显然获得有效令牌并尝试 post 时restful api 一直在失败?
有什么想法吗?我真的很感激这方面的帮助 ;-)
谢谢
林顿
您不能使用 OAuth 令牌调用 https://blockchain-cockpit.cfapps.us10.hana.ondemand.com。在我看来,这个 URL 不会公开您想要使用的 API,并且可能需要额外的参数。
我希望你想要使用区块链 API,有更好的方法来做到这一点。
导航至 https://login.cf.us10.hana.ondemand.com/login
- 打开您创建的区块链服务实例。
- 使用有效名称创建服务密钥。
- 创建服务密钥后,您将看到生成的 json,其中包含 apiKey 和 URL。现在您可以使用这个 URL 并调用区块链。
例如post 区块链中的一笔交易:
curl -X POST --header 'Content-Type: application/json;charset=UTF-8' --header 'Accept: application/json' --header 'apiKey: <apiKey_which_you_receive_after_servicekey_creation>' -d '{
"chaincodeId": "your_chaincode_id",
"fcn": "your_func_name",
"args": []
}
' '<URL_from_service_key_creation>/invoke'
并且,如果您想从区块链查询交易,请将调用替换为查询。
您不通过区块链驾驶舱调用您的链代码 API。
与 SAP Cloud Platform 上的所有其他服务(例如 MongoDB)一样,您必须创建服务 Key/Service 绑定才能访问您的服务实例。
- 登录 SAP 云平台(account.hana.ondemand.com)
- 导航到您创建区块链服务实例的 Space 并打开“服务实例”页面。
- 通过单击 名称
打开您的区块链服务实例
- 单击左侧导航栏中的服务密钥
- 单击
Create Service Key
并指定名称
您现在可以看到您的服务实例的访问信息
{
"apiKey": "",
"serviceUrl": "https://hyperledger-api.cfapps.us10.hana.ondemand.com"
}
您可以通过打开服务 URL 来测试 API: https://hyperledger-api.cfapps.us10.hana.ondemand.com
关于您在评论中提出的问题,要将此信息注入您部署的 Java 应用程序,您必须创建一个服务绑定和 link 区块链服务实例到您的应用程序。然后,您的服务密钥信息将被注入到您应用的环境变量中。更多信息在这里:SAP Help
SAP 云平台使用 Cloud Foundry 来容纳它的一些服务,例如 HyperLedger 等
如果我手动执行以下操作:
我在 https://login.cf.us10.hana.ondemand.com/login
使用有效的用户名/密码登录到一个 cloud foundry 实例然后将我重定向到另一个主机 "blockchain-cockpit.cfapps.us10.hana.ondemand.com",在那里我可以通过网页上提供的 "cockpit" 成功调用有问题的 RESTful API。
我的目标是能够使用 OAuth 令牌在 "blockchain-cockpit.cfapps.us10.hana.ondemand.com" 上调用 RESTful 服务。
所以我转到命令行使用以下命令获取 OAuth 令牌:
curl -v -XPOST -H "Application/json" -u "cf:" --data "username=<username>&password=<password>&client_id=cf&grant_type=password&response_type=token" https://login.cf.us10.hana.ondemand.com/oauth/token
这很高兴地向我传回了 * 似乎是有效的令牌。
例如:
{"access_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImtleS0xIiwidHlwIjoiSldUIn0.eyJqdGkiOiJmZTY1NjYyOTM3YTk0Nzc0YTUyYmM5MzRiYzU5MjRjOCIsInN1YiI6ImMxYzcyZTcyLWI3OGUtNDAyYy1iZTBjLWQ3MDUyNzYzZmZmYiIsInNjb3BlIjpbIm9wZW5pZCIsInVhYS51c2VyIiwiY2xvdWRfY29udHJvbGxlci5yZWFkIiwicGFzc3dvcmQud3JpdGUiLCJjbG91ZF9jb250cm9sbGVyLndyaXRlIl0sImNsaWVudF9pZCI6ImNmIiwiY2lkIjoiY2YiLCJhenAiOiJjZiIsImdyYW50X3R5cGUiOiJwYXNzd29yZCIsInVzZXJfaWQiOiJjMWM3MmU3Mi1iNzhlLTQwMmMtYmUwYy1kNzA1Mjc2M2ZmZmIiLCJvcmlnaW4iOiJsZGFwIiwidXNlcl9uYW1lIjoia2V2aW5AZXJwZ2VuaWUuY29tIiwiZW1haWwiOiJrZXZpbkBlcnBnZW5pZS5jb20iLCJhdXRoX3RpbWUiOjE1MTU4NzE4NTgsInJldl9zaWciOiI2YzIwMjc2YyIsImlhdCI6MTUxNTg3MTg1OCwiZXhwIjoxNTE1ODcyNDU4LCJpc3MiOiJodHRwczovL3VhYS5jZi51czEwLmhhbmEub25kZW1hbmQuY29tL29hdXRoL3Rva2VuIiwiemlkIjoidWFhIiwiYXVkIjpbImNsb3VkX2NvbnRyb2xsZXIiLCJwYXNzd29yZCIsImNmIiwidWFhIiwib3BlbmlkIl19.WgYaTeDqGcJfOpidmTLi06tJnDTC8eGigyWAaEsfDkRmOEWWJhK48dJVjZ43yCh_aECgKq__SUq7kLc48_yWRQ7fjDQSLPXRoZu-4X1YvVB-Xi68PnYAOTtnJFN_F7e6E43mLLNA5_5CdXJ8n88__sJXEoDknrI2R8inmolwIm8AtlvZlh_kuFtF5zt6_RudWkheP8GH8cDBXEEolj0jZtONrJ7bs88E_M07Rgo-fXSdOa6bPMGBCiGPWHqSfLsXGgSaFgeNkBu9_MygAcjx3v3QsQissHfORgzixTCVxT0fyWvoLyc-aWM-NrUzSZNq1hl33l99-QDFWq8sTplSh1Gz1G9y9eJEcH3KI_ycR7FRPmJ4l7eIEjXJm-0r05wqKKwnu8rdkX5hrv55-7qqaM_K32Pug6Sb_lBKfuccz_X7bHWtV7IbybiX_-jU2-CljDAZb6DNl9iTkHhSSKcIODpbItM5BD_AiOuCO8RviuD-P142sjwOD-1dQ9YhsvzQ66UZMjt05FNT7_SaYaxU_i5F6IBXFBmY-zFioIMdJyehGatgaxylqvjS_C_xv0Q7cLW_vsJvlv14AWnBhjD_-KO6oUoGN-llxRK8bo-a56ssfz2eBgNJjjroNw1nAqWU4cFmsOgD3Jni3wIpjBSGzh-ogdx63LCK60DVBu5y1NE","token_type":"bearer","refresh_token":"eyJhbGciOiJSUzI1NiIsImtpZCI6ImtleS0xIiwidHlwIjoiSldUIn0.eyJqdGkiOiIzZmIxOWQ5NWU3ODY0ZWZhOTE2NTM4NzE3ZjM1YzAxMi1yIiwic3ViIjoiYzFjNzJlNzItYjc4ZS00MDJjLWJlMGMtZDcwNTI3NjNmZmZiIiwic2NvcGUiOlsib3BlbmlkIiwidWFhLnVzZXIiLCJjbG91ZF9jb250cm9sbGVyLnJlYWQiLCJwYXNzd29yZC53cml0ZSIsImNsb3VkX2NvbnRyb2xsZXIud3JpdGUiXSwiaWF0IjoxNTE1ODcxODU4LCJleHAiOjE1MTg0NjM4NTgsImNpZCI6ImNmIiwiY2xpZW50X2lkIjoiY2YiLCJpc3MiOiJodHRwczovL3VhYS5jZi51czEwLmhhbmEub25kZW1hbmQuY29tL29hdXRoL3Rva2VuIiwiemlkIjoidWFhIiwiZ3JhbnRfdHlwZSI6InBhc3N3b3JkIiwidXNlcl9uYW1lIjoia2V2aW5AZXJwZ2VuaWUuY29tIiwib3JpZ2luIjoibGRhcCIsInVzZXJfaWQiOiJjMWM3MmU3Mi1iNzhlLTQwMmMtYmUwYy1kNzA1Mjc2M2ZmZmIiLCJyZXZfc2lnIjoiNmMyMDI3NmMiLCJhdWQiOlsiY2xvdWRfY29udHJvbGxlciIsInBhc3N3b3JkIiwiY2YiLCJ1YWEiLCJvcGVuaWQiXX0.SsG45uw8qhSU1ulJ54QZdX8bNnykgGXUwzklBme4sjpNjLd2BuJbW0PHBY7_bHbNiPXplqVGSHsIixaUu-QYqFzs2ebjaGRfBeb9ElwPymI7PRak2gGbw6W1lwHLRpYtIQDp5Ezl9Exj9H_4YW8x7WV4Ca2zRhA8BxayKN7yqSdObR7FVNH0o6-8ZtYcpsHVNKu8KCWCkZ4kEBj4jAHrPmH7FV1AQMSTBK8P-iTWmDbWvsaa0RKxkfveCie_ESgAFt-Y8ZO3mu3zqNCxD238fQc3GJvpE2TPbaAAaSCcTRLBVWLFCiV-2VpmY7Fmv4R80RnzMkV1vOrkNutHNc4NYi3 dYf7JNRJ60Nox1jQRqoMuAS_VSGTiHAnLoOPVf7s0Y09wKuIeVwfB2UHFhs7UtKM7egJGKeZFAOcHAZNL8qbyqkRi0bkOOEMD0mqvEvMHEeS1o5KmYQ7zrxyNgQJgwJ98zMgOzHmC3NQ8o_sNZKTurxNqaPFsbmoB2tCoI9AkfaVdeDOd8tiY6XBAu5h76O7pag9RV4ch_nmViAPYwpD_ZxvwhB_3X0oqSKKNKzZaLW9ONip7yBmMhCub48D_zT26bOKUIYenO1LAV5aHjufsut7YxWBadrPSpGF-Oz6VYYeDqCerf7F8-rdA-RZYGUQBK-weTLJAfbQPn6CgTO4","expires_in":599,"scope":"openid uaa.user cloud_controller.read password.write cloud_controller.write","jti":"fe65662937a94774a52bc934bc5924c8"}* Connection #0 to host login.cf.us10.hana.ondemand.com left intact
假设我现在有一个有效的令牌然后我尝试POST使用POSTMAN并设置HTTP header:
授权:Bearer #token from above#
如前所述,我 POST 正在 "blockchain-cockpit.cfapps.us10.hana.ondemand.com" 而不是我从中获得令牌的主机,因此不确定这是否是这里的主要问题。
PostMan 一直给我这个错误
{ "error": "Not authorized" }
然后我使用 CURL 使用以下命令尝试相同的操作:
curl -H "Authorization: Bearer <token>" -X POST https://blockchain-cockpit.cfapps.us10.hana.ondemand.com/<remaining rest api> --data "test data"
我遇到了完全相同的问题:
{"error":"Not authorized"}
所以我的问题是,如果我手动登录并与站点上的 api 交互,它会完美运行,但是当我显然获得有效令牌并尝试 post 时restful api 一直在失败?
有什么想法吗?我真的很感激这方面的帮助 ;-)
谢谢
林顿
您不能使用 OAuth 令牌调用 https://blockchain-cockpit.cfapps.us10.hana.ondemand.com。在我看来,这个 URL 不会公开您想要使用的 API,并且可能需要额外的参数。
我希望你想要使用区块链 API,有更好的方法来做到这一点。 导航至 https://login.cf.us10.hana.ondemand.com/login
- 打开您创建的区块链服务实例。
- 使用有效名称创建服务密钥。
- 创建服务密钥后,您将看到生成的 json,其中包含 apiKey 和 URL。现在您可以使用这个 URL 并调用区块链。
例如post 区块链中的一笔交易:
curl -X POST --header 'Content-Type: application/json;charset=UTF-8' --header 'Accept: application/json' --header 'apiKey: <apiKey_which_you_receive_after_servicekey_creation>' -d '{
"chaincodeId": "your_chaincode_id",
"fcn": "your_func_name",
"args": []
}
' '<URL_from_service_key_creation>/invoke'
并且,如果您想从区块链查询交易,请将调用替换为查询。
您不通过区块链驾驶舱调用您的链代码 API。
与 SAP Cloud Platform 上的所有其他服务(例如 MongoDB)一样,您必须创建服务 Key/Service 绑定才能访问您的服务实例。
- 登录 SAP 云平台(account.hana.ondemand.com)
- 导航到您创建区块链服务实例的 Space 并打开“服务实例”页面。
- 通过单击 名称 打开您的区块链服务实例
- 单击左侧导航栏中的服务密钥
- 单击
Create Service Key
并指定名称 您现在可以看到您的服务实例的访问信息
{ "apiKey": "", "serviceUrl": "https://hyperledger-api.cfapps.us10.hana.ondemand.com" }
您可以通过打开服务 URL 来测试 API: https://hyperledger-api.cfapps.us10.hana.ondemand.com
关于您在评论中提出的问题,要将此信息注入您部署的 Java 应用程序,您必须创建一个服务绑定和 link 区块链服务实例到您的应用程序。然后,您的服务密钥信息将被注入到您应用的环境变量中。更多信息在这里:SAP Help