致虚极 守静笃
OAuth(后端部分)
2020-05-15发布 237

OAuth

在上一篇文章中,大家应该对验证与授权有了一定的认识,但是对于一些小型网站,自己维护一个用户系统有些多余,并且往往用户也不愿意经历麻烦的流程在小网站注册一个账户。这是很OAuth就显得很有用了,现在很多网站都会有QQ登录、微信登录等,非常方便,但是对于前后端分离的项目,使用OAuth会与传统流程有些不同,这篇文章How to Integrate OAuth 2 Into Your Django/DRF Back-end Without Going Insane讲解地很详细,建议大家去看看。

使用第三方库

针对Django REST framework已经有人为我们封装了一个非常易用的库,可以通过pip下载:

$ pip install django-rest-framework-social-oauth2

别忘了在安装前激活虚拟环境,安装完后,打开backend/settings.py文件,注册应用:

INSTALLED_APPS = (
    # ...
    'oauth2_provider',
    'social_django',
    'rest_framework_social_oauth2',
)

同时修改backend/urls.py

urlpatterns = [
    # ...
    path('auth/', include('rest_framework_social_oauth2.urls')),
]

其它配置:

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                # ...
                'social_django.context_processors.backends',
                'social_django.context_processors.login_redirect',
            ],
        },
    },
]

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        # ...
        'oauth2_provider.contrib.rest_framework.OAuth2Authentication', 
        'rest_framework_social_oauth2.authentication.SocialAuthentication',
    ),
}

AUTHENTICATION_BACKENDS = (
    'social_core.backends.github.GithubOAuth2',
    'rest_framework_social_oauth2.backends.DjangoOAuth2',
    'django.contrib.auth.backends.ModelBackend',
)

Github登录

官方示例给了使用FacebookGoogle的示例,但是由于众所周知的原因,这两个网站并不不存在,我们还是使用全球最大同性交友网站Github吧。完成上述配置后,我们去设置Github,注册我们的app。

添加app

登录Github后,点击头像,进入settings中,选择OAuth APP并添加,设置如图:

OAuth APP

关于这里两个URL的设置我们稍后再讨论,现在先这样填写。保存后你会得到一个Client ID和一个Client Secret,将它们写入配置文件:

SOCIAL_AUTH_GITHUB_KEY = '你的ID'
SOCIAL_AUTH_GITHUB_SECRET = '你的密钥'

别忘了要执行python manage.py migrate,为了测试,我们需要打开Django自带的管理后台。

管理后台

选择Applications并添加,记住这里获得的idsecret,等下会用到,为了在下文与Github上的区分,把这里的称为id2secret2。为了测试,让我们进入Github设置:

测试token

选择左上角的Generate new token来创建一个测试用的token

现在我们可以来测试了,运行Django,使用命令行工具curl测试:

$ curl -X POST -d "grant_type=convert_token&client_id=你的id2&client_secret=你的secret2&backend=github&token=测试token" http://localhost:8000/auth/convert-token 


// 返回的数据
{"access_token":"mNZziADXruf1ZfmVtk9m5gviAE491U","expires_in":36000,"token_type":"Bearer","scope":"read write","refresh_token":"kVt09izTo2UijhnMtb5ed3BcqE5j8h"}

接下来在前端的每次请求都使用得到的access_token就行啦,这时候你打开管理后台也会看到新增加了一个用户,账户名就是你的Github账户名。另外还有关于刷新、删除Token等操作,可以去看这个库的文档,就不过多介绍了。

前端部分

目前我们只讲了如何在取得Github的Token的情况下,向Django后端交换Token,用来做用户验证,但是关于前端如何获取Github的Token,以及前后端如何配合,如何共享登录状态还没有讲,这些内容由于涉及到的知识点较多,就留到后面再介绍啦。