oauth2
OAuth 2.0是行业标准的授权协议。 OAuth 2.0取代了2006年创建的原始OAuth协议所做的工作.OAuth 2.0专注于客户端开发人员的简单性,同时为Web应用程序,桌面应用程序,移动电话和客厅设备提供特定的授权流程。该规范及其扩展正在IETF OAuth工作组内开发。
- oauth2授权类型有:
安装:
1
pip install django-oauth-toolkit
配置:
Add oauth2_provider to your INSTALLED_APPS
1
2
3
4INSTALLED_APPS = (
...
'oauth2_provider',
)add oauth2 urls to your urls.py
1
2
3
4urlpatterns = [
...
url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
]Sync your database
1
python manage.py migrate oauth2_provider
other params config
in settings.py1
2
3
4
5
6
7
8
9
10
11OAUTH2_PROVIDER = {
'SCOPES': {
'read': 'Read scope',
'write': 'Write scope',
},
'CLIENT_ID_GENERATOR_CLASS': 'oauth2_provider.generators.ClientIdGenerator',
'AUTHORIZATION_CODE_EXPIRE_SECONDS': 120, # grant code过期时间
'ACCESS_TOKEN_EXPIRE_SECONDS': 60, # 访问token过期时间
}
OAUTH2_PROVIDER_ACCESS_TOKEN_MODEL = 'oauth2_provider.MAccessToken' # 重载access_token model
in new models.py
1 | from oauth2_provider.models import AbstractAccessToken |
- 还需要自定义一个/accounts/login/ 的url,访问/o/authorize/检测到未登陆状态,会跳转到/accounts/login/路径,提示登录
- add /accounts/login/ url
in urls.py1
2
3
4
5
6from .views import Authenticate2View
urlpatterns = [
url(r'^login/$', Authenticate2View.as_view(), name="login"),
]
in views.py
1 | import urllib |
举个腻子:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18oauth_url = 'http://localhost:8000/accounts/login/?next=/o/authorize/%3Fresponse_type%3Dcode%26client_id%3D4QM7Jeom33SwvXX2Tn4F74JgHIugXZjrliR1AlSe%26redirect_uri%3Dhttps%3A//www.baidu.com/'
# 首先:get oauth_url ;
# 然后:post oauth_url 返回code码 ;
# 然后:用下面参数post to /o/token ;
o_token_post = {
'grant_type': 'authorization_code',
'client_id': '4QM7Jeom33SwvXX2Tn4F74JgHIugXZjrliR1AlSe',
'code': 'AU95GBaLoN4PgFKyBKQ9nk2dcUnzbu',
'redirect_uri': 'https://www.baidu.com/',
}
# 返回access_token和refresh_token ;
# 刷新token:post to /o/token ;
refresh_token_post = {
'grant_type': 'refresh_token',
'client_id': '4QM7Jeom33SwvXX2Tn4F74JgHIugXZjrliR1AlSe',
'refresh_token': 'YtyBvQJKFXVCmdqciMZ9KVu9psosUb',
'redirect_uri': 'https://www.baidu.com/',
}上面的client_id等信息来自于在django—admin登录以后创建的applications,发现一个问题貌似application只能通过django-admin来创建,自己直接用接口调用/o/applications/register/总是报403的错误,如果你有不通过django-admin来创建application的方法请告诉我,目前我的解决办法是直接通过数据库来创建,感觉有点蠢,桑心!