• Stars
    star
    104
  • Rank 330,604 (Top 7 %)
  • Language
    Python
  • License
    BSD 4-Clause "Ori...
  • Created over 11 years ago
  • Updated over 11 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

[DISCARDED]A Django APP for Social accounts login via OAuth2 Service

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

More Repositories

1

social-oauth

OAuth2 for Chinese social sites
Python
324
star
2

make-proxy

HTTP/HTTPS/Socks4/Socks5 proxy written in Erlang
Erlang
270
star
3

django-siteuser

Register, Login, OAuth2, Upload avatar...
Python
256
star
4

renren-relationship

人人好友关系
Python
186
star
5

seven-cow

Yet another qiniu cloud storage Python SDK. More Pythonic, More simple to use
Python
132
star
6

codebattle-ai

AI Example for Codebattle
Erlang
45
star
7

django-upload-avatar

A django app for upload avatars
Python
40
star
8

paper

Feel free about writing blog. This is a simple blog system, Just bloging, Implemented on bottle
Python
35
star
9

playground

Erlang
32
star
10

duckadmin

A Django reusable app for show and operate custom forms in admin.
Python
30
star
11

abchat

Abstract Simple Chat Server Based on Gevent
Python
24
star
12

timerush

Python Timer Framework
Python
21
star
13

djangowebsocket

Python
20
star
14

i3-dzen2-bridge

Bridged the i3status and dzen2 to make dzen2 display icons
Python
20
star
15

vim-linemovement

simplify the line movement in vim
Vim Script
20
star
16

unity3d-scripts

A Collections of useful Scripts/Examples for Unity3d
C#
18
star
17

codebattle-server

codebattle server
Erlang
17
star
18

daemonize

Python Daemonize
Python
15
star
19

redis-lua-scripts

Lua script using with Redis
Python
14
star
20

vim-alignment

Align What You Want!
Vim Script
13
star
21

eipp

A C++11 Header Only Library for using erlang ei library.
C++
13
star
22

python-gears

A BBS Based On Django.
JavaScript
11
star
23

myblogposts

Posts of my blog
10
star
24

learn-you-some-erlang-zh

learn you some erlang 的简体中文翻译
9
star
25

codebattle-client

unity3d client of codebattle
C#
7
star
26

TRsound

For prononnce words with a terminal translation
C
4
star
27

gstatus

display git log in browser
Python
3
star
28

codebattle-proto

proto files for codebattle
3
star
29

django-admin-lastlocation

Return the last location after editing some item
Python
3
star
30

dianjing

Python
2
star
31

myfirefox

firefox plugins
2
star
32

redis-benchmark

Erlang
2
star
33

notebook

Erlang
2
star
34

arrow

Erlang Datetime Utils
Erlang
2
star
35

termgif

record your terminal to animated gif
C
2
star
36

mytools

自己的一些脚本工具
Python
1
star
37

sudoku

sudoku solved in my own way
C++
1
star
38

aoi

C++
1
star
39

smoke

A set collections of WSGI Middleware
Python
1
star
40

sanguo-server

Python
1
star