Auth0正确的方式来调用userinfo

时间:2017-12-30 13:43:09

标签: api authentication scope auth0 userinfo

我创建了一个使用RS256签名算法的API和http://localhost:3000/api/v1作为标识符(观众),我添加了openid,phone,profile作为创建的API的范围

然后创建了一个应用程序来调用上面的API,使用RS256签名并关闭OIDC Conformant,因为我使用的是自定义登录页面。

我能够成功调用以下授权请求:

https://hostname.auth0.com/authorize?client_id=CLIENT_ID&redirect_uri=http://localhost:4200/dashboard&response_type=code&scope=openid%20profile&state=state&nonce=nonce&audience=https://hostname.auth0.com/userinfo

获取代码后,我能够执行令牌调用并收到access_token

curl --request POST \ --url https://hostname.auth0.com/oauth/token \ --header 'content-type: application/json' \ --data '{"client_id":"CLIENT_ID","client_secret":"CLIENT_SECRET","audience":"localhost:3000/api/v1","grant_type":"client_credentials","code": "CODE"}'

但在解码JWT令牌后,我无法在观众区域看到userinfo端点

所以我在执行以下userinfo调用时遇到了未经授权的错误,但我能够使用给定的访问令牌调用我的其他API(安全资源)而没有任何问题。

 curl --request GET \
 --url 'https://hostname.auth0.com/userinfo' \
 --header 'authorization: Bearer {ACCESS_TOKEN}' \
 --header 'content-type: application/json'

未经授权

- 然后我尝试使用userinfo url作为受众值调用令牌端点:

 curl --request POST \
 --url https://hostname.auth0.com/oauth/token \
 --header 'content-type: application/json' \
 --data '{"client_id":"CLIENT_ID","client_secret":"CLIENT_SECRET","audience":"https://hostname.auth0.com/userinfo","grant_type":"client_credentials","code": "CODE"}'

然后我收到以下错误:

 {"error":"access_denied","error_description":"Client is not authorized to access \"https://hostname.auth0.com/userinfo\". You might probably want to create a \"client-grant\" associated to this API. See: https://auth0.com/docs/api/v2#!/Client_Grants/post_client_grants"}

当我在创建API时尝试将userinfo网址添加为其他标识符(受众群体)时,我收到错误消息,提供标识符已保留'

请让我知道我在这里做错了什么。期待您的回复。

感谢。

1 个答案:

答案 0 :(得分:1)

我看到你正在做的事情有多个问题。

如果您还希望获得API的访问令牌,则应在初始audience调用中将该API的标识符指定为/authorize。我们假设有/userinfo个受众群体,因此您不需要特别提及它。例如,如果您的API标识符为https://api.example.com

https://hostname.auth0.com/authorize?client_id=CLIENT_ID&redirect_uri=http://localhost:4200/dashboard&response_type=code&scope=openid%20profile&state=state&nonce=nonce&audience=https://api.example.com

您可能还想在上面的调用中指定API中定义的一些范围(openidprofile除外)。

将代码更改为令牌时,grant_type应为authorization_code(不是client_credentials)。此外,您不需要在此代码交换期间再次指定受众。但请务必在此处指定您在初始redirect_uri请求中发送的/authorize。这是防止一些攻击媒介所必需的。

根据以上几点更改API调用应该会返回正确的访问令牌 - 可以用来调用您的API和/userinfo端点。

有关此流程的更多信息,请参阅文档:https://auth0.com/docs/api-auth/tutorials/authorization-code-grant