def post(self, request, provider): data = request.DATA uid = data.get('uid') access_token = data.get('access_token') strategy = get_strategy(provider) social_response = { 'access_token': access_token, 'uid': uid, 'openid': uid, 'provider': provider, } log.info('api.oauth.bind.outer.login\n{}'.format(social_response)) if provider == 'qq': social_response.update({ 'SOCIAL_AUTH_QQ_KEY': settings.SOCIAL_AUTH_MOBILE_QQ_OAUTH_CONSUMER_KEY }) try: # 请求三方接口获得用户信息 detail = strategy.backend.user_data(access_token, response=social_response) log.info('api.user.bind.oauth.login.response\n{}'.format(detail)) if 'errcode' in detail: server_track(request, 'api.user.oauth.bind_failure', { 'bind_type': 'social_oauth', 'provider': provider, 'uid': request.user.id, 'error': { 'msg': u'三方登录失败', 'detail': detail, }, }) raise error.Error(error.SOCIAL_OAUTH_LOGIN_FAILED, u'三分登陆失败') except Exception as ex: server_track(request, 'api.user.oauth.bind_failure', { 'bind_type': 'social_oauth', 'provider': provider, 'uid': request.user.id, 'error': { 'msg': ex.__class__.__name__, } }) raise error.Error(error.SOCIAL_OAUTH_LOGIN_FAILED, u'三分登陆失败') try: _new_association(strategy, detail, request.user, created_on='mobile_bind') server_track(request, 'api.user.oauth.bind_success', { 'unbind_type': 'social_oauth', 'provider': provider, 'uid': request.user.id }) except AuthAlreadyAssociated as ex: server_track(request, 'api.user.oauth.bind_failure', { 'bind_type': 'social_oauth', 'provider': provider, 'uid': request.user.id, 'error': { 'msg': ex.__class__.__name__, } }) raise error.Error(error.SOCIAL_OAUTH_AUTH_ALREADY_ASSOCIATED, u'该账号已被其它账号绑定') return Response(status=status.HTTP_201_CREATED)
def new_association(request): detail = request.session.get("authentication_user_detail") provider = detail["social_provider"] strategy = get_strategy(provider) _new_association(strategy, detail, request.user) provider_platform = PROVIDER_MAPPER.get(provider, {}).get("platform", u"三方") context = {"provider": provider_platform} return render_to_response("oauth/oauth_bind_success.html", context)
def new_association(request): detail = request.session.get('authentication_user_detail') provider = detail['social_provider'] strategy = get_strategy(provider) _new_association(strategy, detail, request.user) provider_platform = PROVIDER_MAPPER.get(provider, {}).get('platform', u'三方') context = {'provider': provider_platform} return render_to_response('xuetangx/oauth/oauth_bind_success.html', context)
def authentication_success(request): """ 新用户注册时 用户直接走oauth后通过python-social-auth的auth后,成功会回调到此处, 此时django的用户应该是未登录状态 request.user.is_authenticated() is False """ detail = request.session.get("authentication_user_detail") # inviter_id = request.session.get('inviter_id') provider = detail["social_provider"] strategy = get_strategy(provider) enrollment_action = request.session.get("enrollment_action") classroom_id = request.session.get("classroom_id") user, _created = _get_or_create_oauth_user(strategy, detail, request) # # 如果有邀请 # if inviter_id: # _create_user_invite(inviter_id, user) login(request, user) user_profile = user.profile user_profile.last_login_ip = request.META.get("REMOTE_ADDR", None) user_profile.save() # 如果用户没有登录就选课,并且这时候选择的是oauth,尝试enroll课程 if enrollment_action: request.method = "POST" request.POST = request.POST.copy() request.POST["enrollment_action"] = enrollment_action request.POST["classroom_id"] = classroom_id classroom = Classroom.objects.get(id=classroom_id) classroom.user = request.user classroom.save() # try_change_enrollment(request) next_url = request.session.get("next", "") context = {"next": next_url} # track_log(request, 'oauth.user.login_success', { # 'success': True, # 'uid': user.id, # 'provider': strategy.backend.name, # }) return render_to_response("oauth/oauth_login_success.html", context)
def authentication_success(request): ''' 新用户注册时 用户直接走oauth后通过python-social-auth的auth后,成功会回调到此处, 此时django的用户应该是未登录状态 request.user.is_authenticated() is False ''' detail = request.session.get('authentication_user_detail') inviter_id = request.session.get('inviter_id') provider = detail['social_provider'] strategy = get_strategy(provider) enrollment_action = request.session.get('enrollment_action') course_id = request.session.get('course_id') user, _created = _get_or_create_oauth_user(strategy, detail, request) # 如果有邀请 if inviter_id: _create_user_invite(inviter_id, user) login(request, user) user_profile = user.profile user_profile.last_login_ip = request.META.get('REMOTE_ADDR', None) user_profile.save() # 如果用户没有登录就选课,并且这时候选择的是oauth,尝试enroll课程 if enrollment_action: request.method = 'POST' request.POST = request.POST.copy() request.POST['enrollment_action'] = enrollment_action request.POST['course_id'] = course_id try_change_enrollment(request) next_url = request.session.get('next', '') context = {'next': next_url} track_log(request, 'oauth.user.login_success', { 'success': True, 'uid': user.id, 'provider': strategy.backend.name, }) return render_to_response('xuetangx/oauth/oauth_login_success.html', context)
def social_oauth(self, request, data, client): """ Handle ``grant_type=social_oauth`` requests as defined in :draft:`4.3`. """ data = self.get_social_oauth_grant(request, data, client) uid = data.get('uid') access_token = data.get('access_token') provider = data.get('provider') scope = data.get('scope') strategy = get_strategy(provider) social_response = { 'access_token': access_token, 'uid': uid, 'openid': uid, 'provider': provider, } logging.info('api.oauth.outer.login\n{}'.format(social_response)) if provider == 'qq': social_response.update({ 'SOCIAL_AUTH_QQ_KEY': settings.SOCIAL_AUTH_MOBILE_QQ_OAUTH_CONSUMER_KEY }) user = _created = detail = None try: # 请求三方接口获得用户信息 detail = strategy.backend.user_data(access_token, response=social_response) logging.info('api.user.oauth.login.response\n{}'.format(detail)) if 'errcode' in detail: server_track(request, 'api.user.oauth.login_failure', { 'login_type': 'social_oauth', 'error': { 'msg': u'三方登录失败', 'detail': detail, }, }) return self.error_response({ 'error': u'三方登录失败', 'error_description': u"三方登录失败" }, request=request) except Exception as ex: server_track(request, 'api.user.oauth.login_failure', { 'login_type': 'social_oauth', 'error': { 'msg': ex.__class__.__name__, } }) return self.error_response({ 'error': u'三方登录失败', 'error_description': u"三方登录失败" }, request=request) try: # 创建用户: TODO: 异常处理 user, _created = _get_or_create_oauth_user(strategy, detail, request, mobile_client=True, created_on='mobile') if _created: server_track(request, 'api.user.oauth.register_success', { 'uid': user.id, 'username': user.username, 'provider': strategy.backend.name, }) except Exception as ex: if not user and (_created is None): server_track(request, 'api.user.oauth.register_failure', { 'register_type': 'social_oauth', 'error': { 'msg': ex.__class__.__name__, }, }) return self.error_response({ 'error': u'三方登录失败', 'error_description': u"三方登录失败" }, request=request) if constants.SINGLE_ACCESS_TOKEN: at = self.get_access_token(request, user, scope, client) else: at = self.create_access_token(request, user, scope, client) rt = self.create_refresh_token(request, user, scope, at, client) # track user login ip # TODO: track in authorization grant typer last login ip in auth_userprofile user_profile = UserProfile.objects.get(user=user) user_profile.last_login_ip = request.META.get('REMOTE_ADDR', None) user_profile.save() sid = request.META.get('HTTP_SID') uid = user.id uuid = request.META.get('HTTP_UUID') if uuid: device, _ = DeviceInfo.objects.get_or_create(uuid=uuid) device.uid = uid device.save() if sid: timestamp = time.time() IDsInfo.new(sid, uid, uuid, timestamp) uuid = request.META.get('HTTP_UUID') response = self.access_token_response(at) set_login_response_header(request, response) login_type = response.get('login_type', '') server_track(request, 'api.user.oauth.login_success', { 'uid': user.id, 'username': user.username, 'provider': strategy.backend.name, 'login_type': login_type, }) if _created: response['register_type'] = 'social_oauth' return response