授权VK API错误:u'{“错误”:“ invalid_request”,“ error_description”:“安全错误”}'

时间:2019-07-01 10:05:44

标签: python-2.7 python-requests vk

我正在尝试通过vk.com上的djano-app授权。我正在使用请求和客户端授权。我正在尝试通过这种方式进行授权并出现错误:

{"error":"invalid_request","error_description":"Security Error"}

Internet建议在浏览器中重新登录VK,但没有任何通过代码授权的解决方案。

我的代码:

class VkApiSingleton(object):
    api_version = '5.95'

    def __init__(self,
                 app_id=config.APP_ID,
                 login=config.ACCOUNT_LOGIN,
                 pswd=config.ACCOUNT_PASSWORD,
                 permissions='video,offline,groups'
                 ):
        # type: (int, str, str, str) -> None

        self.app_id = app_id
        self.app_user_login = login
        self.app_user_pass = pswd

        self.access_token = None
        self.user_id = None

        self.session = requests.Session()
        self.form_parser = FormParser()

        self.permissions = permissions

    def __new__(cls, *args, **kwargs):
        if not hasattr(cls, 'instance'):
            cls.instance = super(VkApiSingleton, cls).__new__(cls, *args,     **kwargs)
        return cls.instance

    @property
    def get_session(self):
        return self.session

    def _parse_form(self, response):
        # type: (requests.models.Response) -> None
        self.form_parser = FormParser()
        try:
            self.form_parser.feed(str(response.content))
        except Exception as err:
            logger.exception(
                'Error checking HTML form',
                extra={'Error body': str(err)}
            )

    def _submit_form(self, **kwargs):
        # type: (dict) -> requests.models.Response
        if self.form_parser.method == 'post':
            payload = copy.deepcopy(self.form_parser.params)
            if kwargs.get('is_login', False):
                payload.update({
                    'email': self.app_user_login,
                    'pass': self.app_user_pass
                })

        with self.get_session as session:
            try:
                return session.post(self.form_parser.url, data=payload)
            except Exception as err:
                logger.exception(
                    'Error submitting auth form',
                    extra={'Error body': str(err)}
                )
                raise VkApiError('Error submitting auth form: %s' % str(err))

    def _log_in(self):
        # type: () -> requests.models.Response
        response = self._submit_form(is_login=True)
        self._parse_form(response)

        if response.status_code != 200:
            raise VkApiError('Auth error: cant parse HTML form')

        if 'pass' in response.text:
            logger.error(
                'Wrong login or password'
            )
            raise VkApiError('Wrong login or password')

        return response

    def _submit_permissions(self, url=None):
        # type: () -> requests.models.Response
        if 'submit_allow_access' in self.form_parser.params and 'grant_access' in self.form_parser.url:
            return self._submit_form(token_url=url)
        else:
            logger.warning(
                'Cant submit permissions for application'
            )

    def _get_token(self, response):
        # type: (requests.models.Response) -> None

        try:
            params = response.url.split('#')[1].split('&')
            self.access_token = params[0].split('=')[1]
            self.user_id = params[2].split('=')[1]
        except IndexError as err:
            logger.error(
                'Cant get access_token',
                extra={'Error body': str(err)}
            )

    def auth(self):
        auth_url = 'https://oauth.vk.com/authorize?revoke=1'
        redirect_uri = 'https://oauth.vk.com/blank.html'
        display = 'wap'

        request_params = {
            'client_id': self.app_id,
            'scope': self.permissions,
            'redirect_uri': redirect_uri,
            'display': display,
            'response_type': 'token',
            'v': self.api_version
        }

        with self.get_session as session:
            response = session.get(
                auth_url,
                params=request_params
            )    

        self._parse_form(response)

        if not self.form_parser.form_parsed:
            raise VkApiError('Invalid HTML form. Check auth_url or params')
        else:
            login_response = self._log_in()

            permissions_response = self._submit_permissions()

            self._get_token(login_response)

1 个答案:

答案 0 :(得分:0)

如果有人遇到类似的问题-我发现了一些原因。

1)授权类型无效-尝试使用另一种授权类型(在官方文档中有描述) 2)授权过多。

我解决了这样的问题: 1)通过“客户端应用程序授权”获得具有“脱机”权限的令牌 2)每次我需要使用vk.api方法时-我正在使用安全方法“ secure.checkToken”检查令牌是否已过期(您需要获取Service令牌才能使用此方法。官方文档中有很多信息) 3)如果我的令牌过期-我正在获得新的令牌。