django-oauth2-provider:如何在不发送client_secret的情况下获取token

3 投票
5 回答
3740 浏览
提问于 2025-04-17 22:58

我正在使用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,这样可以确保授权信息被传递。

撰写回答