django-oauth2-provider:获取令牌而不发送client_secret

时间:2014-03-19 13:39:42

标签: python django oauth-2.0

我正在使用django-oauth2-provider和rest-framework在我的API中提供身份验证。 我的移动应用程序将连接到我的REST API以检索一些数据。没有第三方应用程序会参与此过程。

根据this,此用例所需的授权类型将是密码授予。由于将秘密存储在设备中是一个坏主意,我需要在没有它的情况下访问令牌。

我试图在没有秘密的情况下发送请求:

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 :(得分:1)

您需要通过django管理员界面创建客户端并替换" MY_CLIENT_ID"带有身份证。

答案 1 :(得分:1)

应用程序的“客户端类型”应为“公共”

答案 2 :(得分:1)

  1. Authorization Grant Type设为Resource owner password-based
  2. WSGIPassAuthorization On放在与WSGIScriptAlias
  3. 相同的位置

答案 3 :(得分: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

答案 4 :(得分:0)

只需组合解决方案即可。这对我有用。继续执行Getting Started guide。但是,在创建应用程序时,请提供以下内容:

  • 名称:您选择的名称
  • 客户端类型:公共
  • 授权授予类型:基于资源所有者的密码

然后请求应该是:

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>"
}'