- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试用 python 编写一个小脚本来连接到 BOX,但它一直给我这个错误:'NoneType' 对象没有属性 'encode'
一开始我以为是我对Passphrase进行编码造成的,但好像不是这样。当我尝试使用 access_token = auth.authenticate_instance() 进行身份验证时,脚本失败。如果我在没有它的情况下运行脚本,它似乎可以工作。可能是什么原因造成的?
在此先感谢您提供的任何帮助。
这是我的:
import keyring
from boxsdk import JWTAuth
from boxsdk import Client
def read_tokens():
"""Reads authorisation tokens from keyring"""
# Use keyring to read the tokens
auth_token = keyring.get_password('Box_Auth', 'mybox@box.com')
refresh_token = keyring.get_password('Box_Refresh', 'mybox@box.com')
return auth_token, refresh_token
def store_tokens(access_token, refresh_token):
"""Callback function when Box SDK refreshes tokens"""
# Use keyring to store the tokens
keyring.set_password('Box_Auth', 'mybox@box.com', access_token)
keyring.set_password('Box_Refresh', 'mybox@box.com', refresh_token)
Passphrase = 'xxxxxxx';
my_str_as_bytes = Passphrase.encode('UTF-8','strict')
auth = JWTAuth(
client_id='xxxxxxxxxx',
client_secret='xxxxxxxx',
enterprise_id='xxxxxxx',
jwt_key_id='xxxxxxx',
rsa_private_key_file_sys_path='/home/Marketscale/keys/private_key2.pem',
rsa_private_key_passphrase=my_str_as_bytes,
store_tokens=store_tokens,
)
access_token = auth.authenticate_instance()
这是错误的全文:
Traceback (most recent call last):
File "/home/Marketscale/Tests/JWTTest.py", line 37, in <module>
access_token = auth.authenticate_instance()
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/jwt_auth.py", line 186, in authenticate_instance
return self._auth_with_jwt(self._enterprise_id, 'enterprise')
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/jwt_auth.py", line 158, in _auth_with_jwt
return self.send_token_request(data, access_token=None, expect_refresh_token=False)[0]
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/oauth2.py", line 298, in send_token_request
self._store_tokens(access_token, refresh_token)
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/oauth2.py", line 233, in _store_tokens
self._store_tokens_callback(access_token, refresh_token)
File "/home/Marketscale/Tests/JWTTest.py", line 22, in store_tokens
keyring.set_password('Box_Refresh', 'mybox@box.com', refresh_token)
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/keyring/core.py", line 48, in set_password
_keyring_backend.set_password(service_name, username, password)
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/keyrings/alt/file_base.py", line 128, in set_password
password_encrypted = self.encrypt(password.encode('utf-8'), assoc)
AttributeError: 'NoneType' object has no attribute 'encode'
最佳答案
我完全不知道您使用的 API,但根据查看代码的一些想法:
从下往上遍历堆栈跟踪,您有:
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/keyrings/alt/file_base.py", line 128, in set_password
password_encrypted = self.encrypt(password.encode('utf-8'), assoc)
AttributeError: 'NoneType' object has no attribute 'encode'
该代码位于 https://github.com/jaraco/keyrings.alt/blob/master/keyrings/alt/file_base.py ,密码(我们知道它是 None)是传递给 set_password 函数的最后一个参数。调用自:
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/keyring/core.py", line 48, in set_password
_keyring_backend.set_password(service_name, username, password)
该代码位于 https://github.com/jaraco/keyring/blob/master/keyring/core.py , 而密码又是 set_password 函数的最后一个参数。接下来,我们有:
File "/home/Marketscale/Tests/JWTTest.py", line 22, in store_tokens
keyring.set_password('Box_Refresh', 'mybox@box.com', refresh_token)
....这是你的代码,所以 refresh_token 一定是 None。这意味着您的 store_tokens 必须使用 None 的 refresh_token 调用。下一页:
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/oauth2.py", line 233, in _store_tokens
self._store_tokens_callback(access_token, refresh_token)
这是在 https://github.com/box/box-python-sdk/blob/master/boxsdk/auth/oauth2.py ,再次意味着调用 _store_tokens 时将 refresh_token 设置为 None。继续……
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/oauth2.py", line 298, in send_token_request
self._store_tokens(access_token, refresh_token)
代码与上一个页面相同,但现在更有趣了:
url = '{base_auth_url}/token'.format(base_auth_url=API.OAUTH2_API_URL)
headers = {'content-type': 'application/x-www-form-urlencoded'}
network_response = self._network_layer.request(
'POST',
url,
data=data,
headers=headers,
access_token=access_token,
)
if not network_response.ok:
raise BoxOAuthException(network_response.status_code, network_response.content, url, 'POST')
try:
response = network_response.json()
access_token = response['access_token']
refresh_token = response.get('refresh_token', None)
if refresh_token is None and expect_refresh_token:
raise BoxOAuthException(network_response.status_code, network_response.content, url, 'POST')
except (ValueError, KeyError):
raise BoxOAuthException(network_response.status_code, network_response.content, url, 'POST')
self._store_tokens(access_token, refresh_token)
return self._access_token, self._refresh_token
因此我们知道调用 self._store_tokens 时将 refresh_token 设置为 None,这意味着 expect_refresh_token 必须为 False,否则将引发 BoxOAuthException。事实上,如果我们查看堆栈跟踪中的下一行,我们可以看到:
File "/home/Marketscale/.virtualenvs/myvirtualenv/lib/python3.5/site-packages/boxsdk/auth/jwt_auth.py", line 158, in _auth_with_jwt
return self.send_token_request(data, access_token=None, expect_refresh_token=False)[0]
这对我来说表明,当您使用 JWT Auth 时,您不应该期待刷新 token 。并且考虑到当您将 None 作为密码传递给它时 key 环的文件后端会爆炸,听起来您需要以不同的方式处理 None 情况。因此,我建议更改您提供的 store_tokens 函数,以便它忽略刷新 token (如果它为 None),即:
def store_tokens(access_token, refresh_token):
"""Callback function when Box SDK refreshes tokens"""
# Use keyring to store the tokens
keyring.set_password('Box_Auth', 'mybox@box.com', access_token)
if refresh_token is not None:
keyring.set_password('Box_Refresh', 'mybox@box.com', refresh_token)
...或者这样它将 None 转换为 key 环文件后端可以妥善处理的东西——也许一个空字符串就可以解决这个问题:
def store_tokens(access_token, refresh_token):
"""Callback function when Box SDK refreshes tokens"""
# Use keyring to store the tokens
keyring.set_password('Box_Auth', 'mybox@box.com', access_token)
if refresh_token is None:
refresh_token = ""
keyring.set_password('Box_Refresh', 'mybox@box.com', refresh_token)
警告——就像我说的,我不知道这些 API——既不知道你正在使用的盒子,也不知道你正在使用的 key 环。但是根据那里的代码,做这样的事情听起来很值得一试。
关于python-3.x - Boxsdk JWTAuth 一直给我这个错误 : 'NoneType' object has no attribute 'encode' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43553340/
我有一个在 Android 市场上相当流行的应用程序,它允许数以万计的用户按下一个按钮并向它发出语音命令。然后我就可以做很多不同的事情,比如给他们提供当前的天气预报等等...... 无论如何,我的应用
令人惊讶的是,标题基本上解释了它。我们有一个我们的客户制作的页面,我们正在重新创建该页面。 页面高度会一直增加,直到(我假设是这样)浏览器达到它的极限。我已经尝试过 Firebug 和 W3 验证器,
我是 react-native 的新手,试图创建我自己的组件,但它一直显示一个空屏幕。 这是我的组件代码 class BoxComponent extends Component { cons
我正在为我的 PHP 元素创建一个非常简单的博客,但遇到了一个简单的问题。我无法让我的页眉图像一直 float 。我有一个横幅,左边有一些文字,我有一个 1px 的切片,在可以选择的任何分辨率的宽度上
为什么我可以在另一个 Controller 的 View 中访问一个 Controller 的辅助方法?有没有办法在不破解/修补 Rails 的情况下禁用它? 最佳答案 @George Schreib
我正在使用带有最新 ADT 插件的 Eclipse Kepler SP2。每隔一分钟 Eclipse 就会说“为 Android 4.4.2 加载数据”并阻止我想做的一切。我在不同的文件夹中有几个 E
我是一名优秀的程序员,十分优秀!