django-oauth-toolkit使用

写在前面

如果不了解Oauth2认证过程的 可以以微信的认证为例子 了解一下

安装

pip install django-oauth-toolkit==1.2.0

settings.py 文件中增加

INSTALLED_APPS = (
    ...
    'oauth2_provider',
)

urls.py 文件中增加路由

urlpatterns = [
    ...
    path(r'oauth/', include('oauth2_provider.urls', namespace='oauth2_provider')),
]

同步数据库

python manage.py migrate oauth2_provider

使用

Oauth 分为两个角色 Oauth2 ProviderOauth2 ConsumerProvider 即提认证的站点。Consumer 即需要从认证站点获取用户信息的站点。例如:我想从微信处获取用户的微信信息,那么微信就是 Provider 而我的站点就是 Consumer 。下面我们就配置 Provider

创建一个应用

创建应用就类似于将自己的平台信息提供给微信,微信认证之后给你提供 API_KEYAPI_SERCRET 一样。这样的好处是可以确认目标站点是可信的。 可以通过 django-admin 的后台来创建。

WechatIMG11.jpeg

为了方便测试 我们可以将 Redirect urls 设置成 http://django-oauth-toolkit.herokuapp.com/consumer/exchange/
同时我们也只以 Authoriation Code 为例进行说明

测试认证服务器

假设我们的任务服务器的URL就是 http://localhost:8010/oauth/

  • 构建认证链接
    http://localhost:8010/oauth/authorize?state=STATE&client_id=client_id&response_type=code&redirect_uri=CALLBACK_URL&scope=read

    • 其中 state 参数可以是一个随机的字符串,即你传给服务器什么 服务器就返回给你什么
    • response_type 对应四种 grant typecodetokenpasswordclient_credentials 并且不同的 response_type 对应的参数也不同
    • redirect_uri 就是后端的路由 认证完成之后 会跳到 redirect_uri?code=xxx
    • scope 对应的是此次请求的授权权限 read 对应只读
  • 授权应用
    当用户点击认证链接的时候,会跳到认证网页上,上面会提示用户是否要授权xxx应用获取你的个人信息。当你点击授权的时候。就会跳转到 上面设置的 redirect_uri 上。如: redirect_uri?code=xxxx 其中 code 就是授权码。你的站点就可以利用 code 去换取 access_token

  • 获取 access_token
    curl -X POST -d "grant_type=authorization_code&code=xxx" -u"<client_id>:<client_secret>" http://localhost:8010/oauth/token/
    其中 这个请求 Basic Auth 认证。注意编码是 x-www-form-urlencode

    {
        "access_token": "5kpaQHTdbnKY86ZI41RQAkU6DNfWKu",
        "expires_in": 36000,
        "token_type": "Bearer",
        "scope": "read write",
        "refresh_token": "GNfVL3x6L20hU95ajvHQtgZI2QBuC2"
    }
    
  • 通过 refresh_token 刷新 access_token

access_token 的使用

  • django 中的使用

    # 首先创建一个路由 继承 oauth2_provider.views.generic.ProtectedResourceView  如:
    from oauth2_provider.views.generic import ProtectedResourceView
    from django.http import HttpResponse
    
    class ApiEndpoint(ProtectedResourceView):
        def get(self, request, *args, **kwargs):
            return HttpResponse('Hello, OAuth2!')
    # 那么在非授权状态下就无法访问这个接口了
    # 需要我们在 request header 中增加  Authorization: Bearer <access_token> 那么就可以访问这个接口了
    
  • 当做 认证的 backend 使用

  • django-rest-framework中使用

    from oauth2_provider.contrib.rest_framework import OAuth2Authentication
    
    class OauthUserViewSet(GenericViewSet):
        serializer_class = serializers.OauthUserModelSerializer
        permission_classes = [perms.UserViewPermission, ]
        queryset = get_user_model().objects.filter(is_active=True)
        authentication_classes = [OAuth2Authentication, ]  # 认证的方式选择  OAuth2Authentication
    
        @action(detail=False, methods=['GET'])
        def user_info(self, request, *args, **kwargs):
            user = request.user
            return Response(self.get_serializer(user, many=False).data)
    # 也可以通过在 header 中增加认证来访问接口了
    

    参考

官方文档
阮老师的解释
关于四种授权模式

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容