欢迎来到我的博客!

django博客开发:使用django-allauth实现第三方账号登录

Django Aaron 1 年,10 月 9003 58评论

打算自己开发一个博客的评论,在此之前决定先做好博客的用户登录、注册系统,使其支持第三方登录。django-allauth,根据其官方文档(这里:https://django-allauth.readthedocs.io/en/latest/index.html),同时支持本地和第三方账号(Github,百度、微博、微信等等。。),集成了邮箱验证、密码修改、本地账号关联(多个)第三方账号等各种功能,果然是好到没朋友。。

开发环境:python 3.4、django 1.10

准备工作

安装

pip install django-allauth

project/settings.py设置

INSTALLED_APPS = [
# 必须安装的app
    'django.contrib.auth',
    'django.contrib.sites',
    'allauth',
    'allauth.account',
    'allauth.socialaccount',

# 下面是第三方账号相关的,比如我选了weibo和github
    'allauth.socialaccount.providers.weibo',
    'allauth.socialaccount.providers.github',
]

# django-allauth相关设置
AUTHENTICATION_BACKENDS = (
# django admin所使用的用户登录与django-allauth无关
    'django.contrib.auth.backends.ModelBackend',

# `allauth` specific authentication methods, such as login by e-mail
    'allauth.account.auth_backends.AuthenticationBackend',
)

# 前面我们app里添加了django.contrib.sites,需要设置SITE_ID
SITE_ID = 1
ACCOUNT_AUTHENTICATION_METHOD = 'username_email'
ACCOUNT_EMAIL_REQUIRED = True

ACCOUNT_AUTHENTICATION_METHOD = 'username_email'  的作用是当用户登录时,既可以使用用户名也可以使用email, 其他可选的值是 "username""email" ,
ACCOUNT_EMAIL_REQUIRED = True  要求用户注册时必须填写email,默认False,emial是选填的。

project/urls.py 里include allauth的urls

urlpatterns = [

    url(r'^accounts/', include('allauth.urls')),

]

设置好后,我们就可以用'accounts/login' 访问登录页面, 'accounts/logout' 注销, 其他的可以去 allauth/account/urls.py查看。

以上基本设置后,需要同步数据库 python manage.py migrate

runserver, 访问登录页面,allauth提供的模板非常简陋, 是这样的crying

我们可以使用自己制作的模板,在project/templates/account下创建login.html即可override allauth自带的模板,allauth自带的模板放在allauth/templates/account下, 我们只需要在项目templates/account下创建相同名字的html即可覆盖。

测试

下面我们去注册页面test一下,先注册一个本地账号

填写完注册信息后,却出现这样一个错误

出现此错误的原因,官方文档也有说明,这是因为注册账号后,系统会自动发一封邮件来激活账号,但是我们还有发送邮件相关的设置。

django默认使用SMTP发送邮件,在project/settings.py如下设置:

# Email setting
# SMTP服务器,我使用的是sendclound的服务
EMAIL_HOST = 'smtp.sendcloud.net'
EMAIL_HOST_USER = '用户名'
EMAIL_HOST_PASSWORD = '对应的API key或者密码'
EMAIL_PORT = 25

# 是否使用了SSL 或者TLS
#EMAIL_USE_SSL = True
#EMAIL_USE_TLS = True
# 默认发件人,不设置的话django默认使用的webmaster@localhost
DEFAULT_FROM_EMAIL = 'Aaron-Zhao <noreply@aaron-zhao.com>'

完成以上设置后,注册账号是我们就可以收到邮件了,关于邮件的其他详细设置,请参照django的官方文档

allauth默认的设置,当用户登录时会重定向到  accounts/profile,这个页面allauth没有做,因为报错page not found,这个页面需要我们自己完成(请戳:django博客开发:添加用户资料页面和头像上传功能)。与此相关的参数是LOGIN_REDIRECT_URL

在project/settings.py设置 LOGIN_REDIRECT_URL = '/' ,这样用户登录后的页面就会跳转到首页,而不是用户profile页面。

下面我们去测试一下第三方账号登录,这里以github为例

Github OAuth注册页面:https://github.com/settings/applications/new

要注意将回调地址callback URL设置为 http://127.0.0.1:8000/accounts/github/login/callback/,完成注册后 我们会获得一个Cliend ID 和 Client Secret,后面我们会用到

先进入admin后台,会发现增加了social accounts和站点

点开站点管理,将example.com改为我们博客的域名,在开发环境下,我们用127.0.0.1:8000

点击SOCIAL ACCOUNTS下的Social application,增加一个application,如下图所示

provider选Github,这里的provider就是我们在INSTALLED_APP里增加的socialaccount.provider,client id 和secret key 我们在github注册应用里获得了,将sites加入到右边 选中的sites

完成以上设置后,注销,然后回到登录页面,选中github登录,授权应用即可,成功登录后,邮箱里也会收到一份激活邮件,这是因为django-allauth会自动为我们添加一个本地账号,根据你的social account用户名和email。

获取头像

通过allauth第三方登录后,会创建一个本地账号(User)和socialaccount,User模型和allauth提供的socialaccount模型之间是一对多的对应关系

user.socialaccount_set # 与user关联的socialaccount集合

user.socialaccount_set.exists() # 判断user是否绑定第三方账号

user.socialaccount_set.first() # 获取绑定的第三方账号

user.socialaccount_set.first().get_avatar_url() # 获取头像url

# 第三方账号的信息,返回一个字典类型
user.socialaccount_set.first().extra_data

在模板里获取头像的url

<img src="{{ user.socialaccount_set.all.0.get_avatar_url }}">

其他相关设置

project/settings.py

ACCOUNT_EMAIL_VERIFICATION = 'optional' / 'mandatory' / 'none'

-- 默认值是'optional',当其等于'mandatory’时,在email未验证之前,本地注册的用户无法登陆。'optional' 和 'none' 则不要求必须验证邮箱,两者区别是'optional' 依然会发送验证邮件,而'none' 则不会

SOCIALACCOUNT_EMAIL_VERIFICATION = 'optional' / 'mandatory' / 'none'

--  与ACCOUNT_EMAIL_VERIFICATION 同理,作用于第三方账号的注册,默认值等于前者,

LOGIN_URL = '/accounts/login'

-- 当用户验证邮件里的验证链接后,如果当前没有登录的用户,则会指向LOGIN_URL

评论 11人参与 | 58条评论