django-social-login

A Django APP for Social account login via OAuth2 Service


Keywords
social, oauth, oauth2, django, login
License
BSD-3-Clause
Install
pip install django-social-login==0.2.0

Documentation

django-social-login

用第三方帐号登录网站

Usage

install

pip install django-social-login

settings.py

下面几项是必要的设置,必须在项目 settings.py 中设置好。 此外还有一些非必要的设置,见这里

  • social_login 加入到 INSTALLED_APPS

  • 设置项目urls.py

    url(r'', include('social_login.urls')) 放到 项目urls.py 的 最下面

    urlpatterns = patterns('',
        url(r'^admin/', include(admin.site.urls)),
        # ...
        url(r'', include('social_login.urls')),
    )
  • SOCIALOAUTH_SITES

    要使用的提供OAuth2服务的站点信息,见 socialoauth文档

  • SOCIAL_LOGIN_USER_INFO_MODEL

    用户信息的model,例如你的app名叫 myapp, 存储用户信息的model叫 UserInfo, 那么这里就设置为 SOCIAL_LOGIN_USER_INFO_MODEL='myapp.UserInfo'

    用户信息表的定义见下面的 说明

  • SOCIAL_LOGIN_ERROR_REDIRECT_URL

    在用户认证过程中发生错误(用户拒绝授权等)时要跳转到的url

  • 'social_login.context_processors.social_sites'

    把它加入到 TEMPLATE_CONTEXT_PROCESSORS 中, 并且在 views 中传递了 context_instance, 那么在模板中就可以通过 {% for s in social_sites %} 的形式在获得配置的站点信息

    s.site_id       在 SOCIALOAUTH_SITES 中配置的 site_id
    s.site_name     站点的 英文名字
    s.site_name_zh  中文名字
    s.authorize_url 引导用户授权的url
    
  • 'social_login.middleware.SocialLoginUser'

    把它加入到 MIDDLEWARE_CLASSES 中, 这样在每个 view 的 request 对象会有一个 siteuser 属性

    如果设置了 siteuser.is_active = False,那么此用户是无法登录的, request.siteuser 判断为None

    可以通过 if request.siteuser 来判断是否有用户登录。 如果有 那么 request.siteuser 是一个 social_login.SiteUser 对象

    可以通过一下方法访问其属性:

    request.siteuser.id                     用户uid
    request.siteuser.is_social              是否是第三方帐号
    request.siteuser.date_joined            用户加入时间
    request.siteuser.user_info.XX           用户信息表中的XX列
    
    request.siteuser.inner_user.XX          XX是定义在自身网站用户登录认证表中的field
    
    # if request.siteuser.is_social is True
    request.siteuser.social_user.site_uid   用户第三方站点中的uid
    request.siteuser.social_user.site_id    用户来自哪个网站的site_id
    

models.py

你的项目至少需要定义两个用户表:

  • 自身网站注册用户的认证表 - 用来保存自身注册用户
  • 用户信息表 - 保存所有用户信息。

example:

from social_login.abstract_models import AbstractInnerUserAuth, AbstractUserInfo

class UserAuth(AbstractInnerUserAuth):
    email = models.CharField(max_length=255, unique=True)
    password = models.CharField(max_length=128)


class UserInfo(AbstractUserInfo):
    pass

对于 AbstractInnerUserAuthAbstractUserInfo 的定义可以直接看 源码

此外,你还可以 扩展 siteuser 表,只要自己定义的表 继承自 social_login.abstract_models.AbstractBaseSiteUser 并且 设置了 abstract = True ,然后在 settings.py 加入 SOCIAL_LOGIN_ABSTRACT_SITEUSER = 'yourapp.YourCustomAbstractSiteUser' 即可 可以参考 example/app/models.py 最下面注释掉的部分

经过上面的设置后, python manage.py validate 无错误就 python manage.py syncdb, python manage.py runserver. 如果有错,请确保正确安装,并且正确设置。完整的例子请参考 example

Login process

第三方登录和自己网站内部注册/登录的流程如下:

  • 当用户点击login后,提供两个选择:

    • 使用已经注册的帐号登录
    • 使用第三方帐号登录

    login

  • 用户可以先 注册 ,并且用此帐号登录,也可以用第三方帐号登录。

    登录一些用户后的状态如下图:

    图中显示了登录过的用户信息,注意 uid为 5 和 6 的用户, 他们来自不同的网站,但用户名却相同。 所以在userinfo表中的 username 不能设置为 unique=True

    status

完整的流程可以 运行 example 中的项目

Optional Settings

SOCIAL_LOGIN_UID_LENGTH

保存用户第三方站点uid的Field是一个 CharField,这个设置用来指定此 CharField的 max_length。 默认255

SOCIAL_LOGIN_CALLBACK_URL_PATTERN

用户认证结束后的回调地址,必须与 在OAuth2服务认证时提供的 redirect_uri 相匹配

默认设置为 r'account/oauth/(?P<sitename>\w+)/?$'

对应的 SOCIALOAUTH_SITES 设置见 doc.md

SOCIAL_LOGIN_DONE_REDIRECT_URL

用户认证成功后的跳转地址。默认为 '/'

如果用户是第一次登录,那么会为其分配一个新的内部uid, 如果以前已经登录过了,就获取其内部uid,然后将次uid设置到 session 中。 最后跳转到 SOCIAL_LOGIN_DONE_REDIRECT_URL

SOCIAL_LOGIN_SITEUSER_SELECT_RELATED

一个siteuser对象有三个 关联关系,(三个关联表)

  • inner_user - 网站自身注册用户
  • social_user - 第三方帐号
  • user_info - 用户信息

所以你可以通过 request.siteuser.inner_user, request.siteuser.social_user, request.siteuser.user_info 来访问相应的数据。

这个就是配置 request.siteuser 在获取的时候,关联join哪几个表, 默认是 user_info, 因为获取用户信息是很频繁的操作。

你可以这样自定义: SOCIAL_LOGIN_SITEUSER_SELECT_RELATED = ('user_info', 'social_user', 'inner_user')

SOCIAL_LOGIN_ENABLE_ADMIN

是否开启 social_login 的admin。默认为开启。开启后的界面如下图:

admin