django-oauth2-provider:如何在不发送client_secret的情况下获取token
我正在使用django-oauth2-provider和rest-framework来为我的API提供身份验证。我的手机应用将连接到我的REST API来获取一些数据。这个过程不会涉及任何第三方应用。
根据这篇文章,在这种情况下需要使用的授权类型是密码授权。因为把密钥存储在设备上并不是个好主意,所以我需要在不使用密钥的情况下获取令牌。
我尝试发送一个没有密钥的请求:
curl -X POST -d "client_id=MY_CLIENT_ID&grant_type=password&username=user&password=pass" http://localhost:8000/oauth2/access_token/
但是我收到的响应是:
{"error": "invalid_client"}
我的问题是,使用django-oauth2-provider是否可以做到这一点,以及该怎么做。
5 个回答
0
你应该使用密码授权类型。下面这个curl命令可以和django-oauth-toolkit一起使用。我相信它也应该适用于其他任何oauth提供者。
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=password&username=user&password=pass&client_id=client_id' 'http://localhost:8000/o/token/'
想了解更多信息,请查看以下链接: https://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified#password
1
这里是一些解决方案的总结。这些步骤对我有效。你可以参考这个入门指南。在创建应用的时候,请提供以下信息:
- 名称:你自己选择的名字
- 客户端类型:公共
- 授权方式:基于资源拥有者密码的方式
然后请求应该是:
curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=password&username=<username>&password=<password>&client_id=<client_id>" http://localhost:8000/o/token/
或者,如果是JSON格式的话,
在settings.py文件中添加:
OAUTH2_PROVIDER = {
# expect request body Content Type application/json
'OAUTH2_BACKEND_CLASS': 'oauth2_provider.oauth2_backends.JSONOAuthLibCore'
}
curl -X POST \
http://localhost:8000/o/token/ \
-H 'Content-Type: application/json' \
-d '{
"grant_type": "password",
"client_id": "<client_id>",
"username": "<username>",
"password": "<password>"
}'
1
应用程序的“客户端类型”应该设置为“公开”
1
你需要通过Django的管理界面创建一个客户端,然后把“MY_CLIENT_ID”替换成你创建的客户端的ID。
2
1. 把 Authorization Grant Type
设置为 Resource owner password-based
,这意思是用资源拥有者的密码来授权。
2. 在和 WSGIScriptAlias
一样的位置,添加 WSGIPassAuthorization On
,这样可以确保授权信息被传递。