def social_login_callback(request, sitename): """第三方帐号OAuth认证登录,只有设置了USING_SOCIAL_LOGIN=True才会使用到此功能""" code = request.GET.get('code', None) if not code: return HttpResponseRedirect(SOCIAL_LOGIN_ERROR_REDIRECT_URL) socialsites = SocialSites(SOCIALOAUTH_SITES) try: site = socialsites.get_site_object_by_name(sitename) site.get_access_token(code) except(SocialSitesConfigError, SocialAPIError): return HttpResponseRedirect(SOCIAL_LOGIN_ERROR_REDIRECT_URL) # 首先根据site_name和site uid查找此用户是否已经在自身网站认证, # 如果查不到,表示这个用户第一次认证登陆,创建新用户记录 # 如果查到,就跟新其用户名和头像 try: user = SocialUser.objects.get(site_uid=site.uid, site_name=site.site_name) SiteUser.objects.filter(id=user.user.id).update(username=site.name, avatar_url=site.avatar) except SocialUser.DoesNotExist: user = SocialUser.objects.create( site_uid=site.uid, site_name=site.site_name, username=site.name, avatar_url=site.avatar ) # set uid in session, then this user will be auto login request.session['uid'] = user.user.id return HttpResponseRedirect(SOCIAL_LOGIN_DONE_REDIRECT_URL)
def _social_sites(): def make_site(site_class): s = socialsites.get_site_object_by_class(site_class) return { 'site_name': s.site_name, 'site_name_zh': s.site_name_zh, 'authorize_url': s.authorize_url, } socialsites = SocialSites(SOCIALOAUTH_SITES) return [make_site(site_class) for site_class in socialsites.list_sites_class()]