Django django-oauth-toolkit

Dec 9, 2015


最近对secfile和其他系统如网络账号进行对接,使用了oauth2.0协议,再次记录一下


安装

  • 安装


#终端
pip install django-oauth-toolkit django-cors-headers

#settings.py
INSTALLED_APPS = (
    'oauth2_provider',
    'corsheaders',
)

MIDDLEWARE_CLASSES = (
    'corsheaders.middleware.CorsMiddleware',
)

CORS_ORIGIN_ALLOW_ALL = True

#urls.py
urlpatterns = patterns(
    url(r'^o/', include('oauth2_provider.urls', namespace='oauth2_provider')),
)
 
  • 创建app

    • http://localhost:8000/o/applications/

授权&token

  • 授权

    • http://localhost:8000/o/authorize?response_type=code&state=whatever&client_id=syj
  • 生成access_token

    • curl -X POST -d “code=lrKz7kEXJMtYePDLnKKAp10rQ0m9iZ &client_id=syj &client_secret=mnHzgZRzbvT920C25o7FnGY &grant_type=authorization_code &redirect_uri=http://localhost:8001/” http://localhost:8001/o/token/

    • redirect_url要和创建app时的一样

    • code为请求授权返回的授权码


制作api

  • 制作api

from oauth2_provider.views.generic import ProtectedResourceView
class ApiEndpoint(ProtectedResourceView):
    def get(self, request, *args, **kwargs):
        return HttpResponse('Hello, OAuth2!')
 
  • 需要加?access_token=才能正确访问

替代django user

  • 配置settings

AUTHENTICATION_BACKENDS = (
    'oauth2_provider.backends.OAuth2Backend',
    #'django.contrib.auth.backends.ModelBackend'      也可以不注释用来登陆admin
)

MIDDLEWARE_CLASSES = (
    '...',
    'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
    'oauth2_provider.middleware.OAuth2TokenMiddleware',
    '...',
)
 
  • 顺序

    • (1).当SessionAuthenticationMiddleware存在时必须在OAuth2TokenMiddleware之前

    • (2).SessionAuthenticationMiddleware不是必须的

    • (3)当OAuth2TokenMiddleware在 AuthenticationMiddleware之前或 AuthenticationMiddleware不存在,则只有token验证

    • (4)OAuth2TokenMiddleware在AuthenticationMiddleware之后,则先账号密码验证,通过的话就没事了,如果没通过在用token

  • login_required

    • 视图保护

from django.contrib.auth.decorators import login_required
@login_required()
def secret_page(request, *args, **kwargs):
    return HttpResponse('Secret contents!', status=200)

urlpatterns = patterns(
    url(r'^secret$', 'my.views.secret_page', name='secret'),
)
 
  • curl -H “Authorization: Bearer 123456” -X GET http://localhost:8000/secret

rest联用

  • 配置

OAUTH2_PROVIDER = {
    'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'}
}
REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'oauth2_provider.ext.rest_framework.OAuth2Authentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}
 
  • permission_classes

from oauth2_provider.ext.rest_framework import TokenHasReadWriteScope, TokenHasScope
api_view里加入
    permission_classes = [permissions.IsAuthenticated, TokenHasReadWriteScope]
    permission_classes = [permissions.IsAuthenticated, TokenHasScope]
 
  • 以password方式建立applications

  • curl -X POST -d “grant_type=password&username=&password=" -u":" http://localhost:8000/o/token/

    获取token

  • curl -H “Authorization: Bearer " http://localhost:8000/users/

  • 在authorize时可以添加scope属性,&scope=read