"error": "invalid_client" django-oauth-toolkit
"error": "invalid_client" django-oauth-toolkit
我正在使用带有 django-oauth-toolkit 的 django rest 框架。当我在本地主机上请求访问令牌时,它会给我访问令牌,如下所示
~/django_app$ curl -X POST -d "grant_type=password&username=<Your-username>&password=<your-password>" -u"<client-id>:<client-secret>" http://localhost:8000/o/token/
{"access_token": "8u92BMmeZxvto244CE0eNHdLYWhWSa", "expires_in": 36000, "refresh_token": "faW06KKK71ZN74bx32KchMXGn8yjpV", "scope": "read write", "token_type": "Bearer"}
但是当我从实时服务器上托管的同一个项目请求访问令牌时,它给我错误 invalid_client。
~/django_app$ curl -X POST -d "grant_type=password&username=<Your-username>&password=<your-password>" -u"<client-id>:<client-secret>" http://<your-domain>/o/token/
{
"error": "invalid_client"
}
我不明白问题出在哪里。我搜索了很多,但没有找到正确的答案。请告诉我如何消除此错误。
我找到了解决方案,而不是 grant_type=password
我使用 grant_type=client_credentials
然后我得到了访问令牌。您可以在下面看到 curl 命令。
curl -X POST -d "grant_type=client_credentials&client_id=<your-client id>client_secret=<your-client secret>" http://your-domain/o/token/
{"scope": "read write", "token_type": "Bearer", "expires_in": 36000, "access_token": "ITx5KCjupsdbvbKvNQFyqZDEw6svSHSfdgjh"}
或
如果你想用 grant-type=password
来做,那么这里是命令:
curl -X POST -d "grant_type=password&username=<your-username>&password=<your-password>&client_id=<your-client id>&client_secret=<your-client secret>" http://your-domain/o/token/
{"access_token": "0BVfgujhdglxC7OHFh0we7gprlfr1Xk", "scope": "read write", "token_type": "Bearer", "expires_in": 36000, "refresh_token": "AwffMPzNXvghlkjhs8dpXk7gbhhjhljlldfE2nI"}
我提到这个 https://developer.amazon.com/de/docs/adm/request-access-token.html 因为我的应用程序是在 AWS 上。
从 django-oauth-toolkit 获取令牌 JavaScript:
async function getToken () {
let res = await fetch("https://<your_domain>/o/token/", {
body: new URLSearchParams({
grant_type: 'password',
username: '<user_name>',
password: '<user_pass>',
client_id: '<client_app_id>',
client_secret: '<client_pass>'
}),
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST"
})
return res.json();
}
console.log(await getToken());
您的客户端应用程序授权类型应该是:"Resource owner password-based"
P.S。我未能通过 "Content-Type" 获得令牌:"application/json",不知道为什么(django-oauth-toolkit 文档对此一无所知)。
我正在使用带有 django-oauth-toolkit 的 django rest 框架。当我在本地主机上请求访问令牌时,它会给我访问令牌,如下所示
~/django_app$ curl -X POST -d "grant_type=password&username=<Your-username>&password=<your-password>" -u"<client-id>:<client-secret>" http://localhost:8000/o/token/
{"access_token": "8u92BMmeZxvto244CE0eNHdLYWhWSa", "expires_in": 36000, "refresh_token": "faW06KKK71ZN74bx32KchMXGn8yjpV", "scope": "read write", "token_type": "Bearer"}
但是当我从实时服务器上托管的同一个项目请求访问令牌时,它给我错误 invalid_client。
~/django_app$ curl -X POST -d "grant_type=password&username=<Your-username>&password=<your-password>" -u"<client-id>:<client-secret>" http://<your-domain>/o/token/
{
"error": "invalid_client"
}
我不明白问题出在哪里。我搜索了很多,但没有找到正确的答案。请告诉我如何消除此错误。
我找到了解决方案,而不是 grant_type=password
我使用 grant_type=client_credentials
然后我得到了访问令牌。您可以在下面看到 curl 命令。
curl -X POST -d "grant_type=client_credentials&client_id=<your-client id>client_secret=<your-client secret>" http://your-domain/o/token/
{"scope": "read write", "token_type": "Bearer", "expires_in": 36000, "access_token": "ITx5KCjupsdbvbKvNQFyqZDEw6svSHSfdgjh"}
或
如果你想用 grant-type=password
来做,那么这里是命令:
curl -X POST -d "grant_type=password&username=<your-username>&password=<your-password>&client_id=<your-client id>&client_secret=<your-client secret>" http://your-domain/o/token/
{"access_token": "0BVfgujhdglxC7OHFh0we7gprlfr1Xk", "scope": "read write", "token_type": "Bearer", "expires_in": 36000, "refresh_token": "AwffMPzNXvghlkjhs8dpXk7gbhhjhljlldfE2nI"}
我提到这个 https://developer.amazon.com/de/docs/adm/request-access-token.html 因为我的应用程序是在 AWS 上。
从 django-oauth-toolkit 获取令牌 JavaScript:
async function getToken () {
let res = await fetch("https://<your_domain>/o/token/", {
body: new URLSearchParams({
grant_type: 'password',
username: '<user_name>',
password: '<user_pass>',
client_id: '<client_app_id>',
client_secret: '<client_pass>'
}),
headers: {
"Content-Type": "application/x-www-form-urlencoded"
},
method: "POST"
})
return res.json();
}
console.log(await getToken());
您的客户端应用程序授权类型应该是:"Resource owner password-based"
P.S。我未能通过 "Content-Type" 获得令牌:"application/json",不知道为什么(django-oauth-toolkit 文档对此一无所知)。