不运行venv时,OpenTok构造函数/ create_session失败

时间:2017-09-15 09:03:17

标签: python credentials opentok python-venv

在Debian服务器上运行 Django rest api with Tokbox 。我通过一个工作正常的python虚拟环境来运行它,但是出于某些原因需要将它从环境中取出来。当我这样做时,在安装所有依赖项并使其运行后出现以下错误:

  

引发RequestError('创建会话失败:%s'%str(e))

     

opentok.exceptions.RequestError:创建会话失败:失败   创建会话,凭证无效

两个键都保存为环境变量并正确恢复,我可以记录它们并且它们是正确的。此外,如果我再次打开python虚拟环境,错误就会消失。

对于记录,导致错误的代码行是:

opentok = OpenTok(api_key, api_secret)
session = opentok.create_session(media_mode=MediaModes.routed)

在源代码中引发异常的函数如下:

try:
        response = requests.post(self.session_url(), data=options, headers=self.headers(), proxies=self.proxies)
        response.encoding = 'utf-8'

if response.status_code == 403:
            raise AuthError('Failed to create session, invalid credentials')

起初我认为它必须是对api密钥和api秘密进行的某种加密或散列。而且Tokbox确实使用了jwt,但它是在构造函数调用的函数中完成的,因此当我不使用虚拟环境时也会这样做。请求中上面调用的函数headers()如下:

def headers(self):
    """For internal use."""
    return {
        'User-Agent': 'OpenTok-Python-SDK/' + __version__ + ' ' + platform.python_version(),
        'X-OPENTOK-AUTH': self._create_jwt_auth_header()
    }

def _create_jwt_auth_header(self):
    payload = {
                  'ist': 'project',
                  'iss': self.api_key,
                  'iat': int(time.time()), # current time in unix time (seconds)
                  'exp': int(time.time()) + (60*3), # 3 minutes in the future (seconds)
                  'jti': '{0}'.format(0, random.random())
              }

    return jwt.encode(payload, self.api_secret, algorithm='HS256')

1 个答案:

答案 0 :(得分:2)

服务器时间似乎正确,但我猜不是。你可以通过从jwt函数中的'iat'减去一些时间来解决这个问题。通过tokbox支持结束找到解决方案,所以道具给他们!

通过以下方式查找安装文件'opentok.py'的位置:

find / -name opentok.py

然后减去3600,如以下几行所示:

def _create_jwt_auth_header(self):
    payload = {
                  'ist': 'project',
                  'iss': self.api_key,
                  'iat': int(time.time()) - 3600, # three minutes ago (seconds)
                  'exp': int(time.time()) + (60*3), # 3 minutes in the future (seconds)
                  'jti': '{0}'.format(0, random.random())
              }

    return jwt.encode(payload, self.api_secret, algorithm='HS256')