我创建了一个 api 网关来将数据放入我的 s3 存储桶中。当我在控制台中测试它时,它没有问题。即使我在授权方测试中测试我的令牌时,它也会返回“允许”,因此我的令牌没有任何问题。我的令牌验证是
^Bearer [-0-9a-zA-z\.]*$
Run Code Online (Sandbox Code Playgroud)
所以我用于生成标题的 python 代码如下所示:
headers = {
"Authorization": "Bearer " + token,
"Content-type": "application/json"
}
Run Code Online (Sandbox Code Playgroud)
我的其余代码是:
response = requests.post(url, headers=headers, data={"id":"0678a93d-ee8c-4db5-a831-1e311be4f04b", "test":"12345"})
print(response.text)
Run Code Online (Sandbox Code Playgroud)
我得到的错误消息是 "{"message":"'{My Token}' not a valid key=value pair (missing equal-sign) in Authorization header: 'Bearer {My Token}'."}"
我的网址如下所示:
https://my-api-gateway.amazonaws.com/MyStage,我在我的资源中使用了 {proxy+}。我注意到如果我将标题从 Content-type 更改为 Accept,它会给我同样的错误,但如果我也将我的 url 更改为https://my-api-gateway.amazonaws.com/MyStage/any-arbitrary-string /,我得到一个
{"response":{"status":"VALID", "message": "success"}}
Run Code Online (Sandbox Code Playgroud)
但该文件没有出现在我的 s3 存储桶中。我该如何解决?
我想从我的选择中检索值,以便我可以提出发布请求。我从文本输入中获取没有问题,但由于某种原因我无法从下拉菜单选择中获取它。我最终得到一个
"TypeError: Cannot read property 'value' of undefined"
这是我正在使用的代码。
import React from "react";
import { Form, Input, Button, Select } from "antd";
const { Option } = Select;
class ItemForm extends React.Component {
handleFormSubmit = event => {
event.preventDefault();
const name = event.target.elements.name.value;
const description = event.target.elements.description.value;
const category = event.target.elements.category.value;
console.log(name, description, this.refs.category.value);
};
render() {
return (
<div>
<Form onSubmit={this.handleFormSubmit}>
<Form.Item label="Form Layout" />
<Form.Item label="Product Name">
<Input name="name" placeholder="Ex: Organic Apple..." />
</Form.Item>
<Form.Item label="Description">
<Input name="description" …
Run Code Online (Sandbox Code Playgroud) 我有两个环境。一个,我从桌面运行,另一个我从 aws lambda 运行。这两个都是python。我机器上的代码是:
import boto3
s3 = boto3.resource('s3')
bucket = 'my-bucket'
obj = s3.Object(bucket,'test.txt')
try:
text = obj.get()['Body'].read().decode()
print("file exists"))
except s3.meta.client.exceptions.NoSuchKey:
print("key does not exist")
Run Code Online (Sandbox Code Playgroud)
当我运行它时,一切正常,如预期的那样。
当我在 lambda 上运行它时,我得到
调用 GetObject 操作时发生错误 (AccessDenied):拒绝访问
我的 lambda 权限是正确的,所以不可能,因为当文件存在时一切正常。我每次运行都会删除文件,因此它与我运行测试代码的顺序无关。为了调试,我这样做了:
except Exception as e:
print(e)
Run Code Online (Sandbox Code Playgroud)
在我的 lambda 代码和本地代码中,查看实际错误是什么。在我的本地机器上,错误是:
调用 GetObject 操作时发生错误 (NoSuchKey):指定的键不存在。
当我在我的 lambda 上运行它时,它是
调用 GetObject 操作时发生错误 (AccessDenied):拒绝访问
为什么我会收到不同的错误消息,如果没有懒惰的“除所有异常”解决方案,我该如何解决这个问题?谢谢
这是我的 lambda 的 CFT
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:ListBucket",
],
"Resource": {
"Fn::Sub": "arn:aws:s3:::my-bucket/*"
}
}
Run Code Online (Sandbox Code Playgroud) 存储用户登录数据(主要是用户名或 uuid)的最佳且安全的方法是什么。那么,我可以在其他组件中使用它吗?我想了几种方法来做到这一点。
我的 authLogin 方法:
export const authLogin = (email, password) => {
return dispatch =>{
dispatch(authStart());
axios.post('http://127.0.0.1:8000/rest-auth/login/',{
email: email,
password: password,
})
.then(res => {
const token = res.data.key;
const expirationDate = new Date(new Date().getTime() + 3600 * 1000);
localStorage.setItem('token',token);
localStorage.setItem('expirationDate',expirationDate)
localStorage.setItem('email', email)#method 1
console.log("My token",localStorage.getItem('token'))
dispatch(authSuccess(token,email));#method 2
dispatch(checkAuthTimeout(3600));
})
.catch(err => {
dispatch(authFail(err))
})
}
}
Run Code Online (Sandbox Code Playgroud) javascript ×2
python ×2
reactjs ×2
amazon-s3 ×1
antd ×1
aws-lambda ×1
boto3 ×1
html ×1
redux ×1