访问API网关时缺少身份验证令牌?

时间:2016-09-23 07:27:19

标签: amazon-web-services aws-api-gateway

我试图通过AWS API Gateway调用Lambda函数。 当我提到身份验证类型为NONE时它工作正常但API变为公共,任何有url的人都可以访问我的API。 为了使API调用安全,我使用身份验证类型AWS_IAM和 还将AmazonAPIGatewayInvokeFullAccess策略附加到我的用户,但收到此错误:

'''
Storing the return result into RDD
'''

session = driver.session()
result = session.run('MATCH (n:Hobby) RETURN  n.hobby AS hobby,id(n) As id LIMIT 10')  
session.close()     

'''
Pulling the keys
'''
keys = result.peek().keys()

'''
Reading all the property values and storing it in a list
'''
values=list()

for record in result:
    rec= list()
    for key in keys:
        rec.append(record[key])
    values.append(rec)

'''
Converting list of values into a pandas dataframe
'''
df = DataFrame(values, columns=keys)     
print df  

'''
Converting the pandas DataFrame to Spark DataFrame
'''  
sqlCtx = SQLContext(sc)
spark_df = sqlCtx.createDataFrame(df)

print spark_df.show()

'''
Converting the Pandas DataFrame to SparkRdd (via Spark Dataframes)
'''
rdd = spark_df.rdd.map(tuple)

print rdd.take(10)

我不知道我在这里缺少什么。

20 个答案:

答案 0 :(得分:68)

我因为一个愚蠢的理由而失去了一些时间:

创建舞台时,显示的链接不包含URL的资源部分:

API网址 https://1111.execute-api.us-east-1.amazonaws.com/dev

API +资源网址 https://1111.execute-api.us-east-1.amazonaws.com/dev/get-list

缺少 / get-list

当然,您需要检查方法配置是否如下所示:

enter image description here

答案 1 :(得分:15)

我认为您是直接尝试访问API链接,这不会起作用,因为API使用IAM角色进行保护,您必须提供AWS身份验证,即访问密钥和密钥。

使用Postman Chrome扩展程序测试您的API: http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html

答案 2 :(得分:8)

请确保您首先在“阶段”树中单击特定的“资源”,因为这将填充具有完整路径到资源(而不只是根路径)的URL: enter image description here

其他原因,请参见http://www.awslessons.com/2017/aws-api-gateway-missing-authentication-token/

答案 3 :(得分:5)

我刚遇到同样的问题,如果无法找到资源,它似乎也会显示此消息。

在我的情况下,我更新了API,但忘了重新部署。在将更新的API部署到我的舞台后,问题得以解决。

答案 4 :(得分:4)

在文档中找到了这个:

如果使用了AWS_IAM授权,您将使用签名版本4协议对请求进行签名。

Signing request with Signature Version 4

您还可以为您的API生成SDK。

How to generate an SDK for an API in API Gateway

为您选择的平台生成SDK后,第6步提到如果您使用AWS凭据,则会对API的请求进行签名:

  1. 要使用AWS凭据初始化API Gateway生成的SDK,请使用类似于以下内容的代码。如果您使用AWS凭据,则将对API的所有请求进行签名。这意味着您必须为每个请求设置适当的CORS Accept标头:

    var apigClient = apigClientFactory.newClient({
      accessKey: 'ACCESS_KEY',
      secretKey: 'SECRET_KEY',
    });
    

答案 5 :(得分:3)

如果您启用了AWS_IAM身份验证,则必须使用AWS Signature Version 4使用AWS凭据对您的请求进行签名。

注意:登录AWS控制台不会自动在浏览器中向您的API发出请求。

答案 6 :(得分:3)

确保创建资源,然后在其中创建方法。那是我的问题。谢谢

enter image description here

答案 7 :(得分:2)

就我而言,我错过了在 api 末尾添加 '/' 反斜杠
这么愚蠢的错误。

https://le9dq5l9.execute-api.eu-west-1.amazonaws.com/v1/putdoctorinfo/

答案 8 :(得分:2)

我尝试了上述所有方法,如果您按照上述答案进行了所有步骤,但仍未解决问题,则:

  1. 在左侧菜单上,点击“资源”
  2. “资源”右侧,点击要测试的api方法,例如“ POST / GET等)
  3. 点击“ ACTION”列表(位于步骤2中的API方法上方
  4. 选择“ DEPLOY API”(即使您已经部署了api,也请这样做)
  5. 在“部署阶段”中,选择“产品”或您在先前部署中编写的内容(它将覆盖您先前的部署
  6. 点击部署

我之所以这样,是因为当我创建“ METHOD REQUEST”(请参阅​​第2步如何进入此菜单)时,在“ Authorization”中选择“ AWS_IAM” 在测试api之后,在aws测试选项中,我在“邮递员”中尝试 那么我会理解“方法请求”中的“授权”中的“无”

我将其更改为无,但是我认为AWS需要重新部署它,如我所解释的

答案 9 :(得分:1)

如果您使用的端点类型为 PRIVATE 的API,请确保:

  1. 您正在从您的AWS账户内调用API(例如:从在您的账户中创建的EC2实例)

  2. 在EC2实例中的路由〜/ .aws / credentials(此路由用于linux实例)中的EC2实例中放置必要的凭据(访问和密钥),如果IAM用户使用MFA aws_session_token 也需要。

  3. 使用基于vpce(vpc端点)的URL。示例:卷曲https://vpce-0c0471b7test-jkznizi5.execute-api.us-east-1.vpce.amazonaws.com/dev/api/v1/status

  4. 您的EC2实例具有一个安全组,而不是允许出站流量流向vpce拥有的另一个安全组,例如:EC2 instance sg

  5. 您的vpce安全组允许来自EC2实例拥有的另一个安全组(来自ec2实例的先前sg)的入站流量,例如:vpce sg

请参阅: https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-private-apis.html

答案 10 :(得分:1)

根据我的经验,请检查以下步骤:

  1. 在 API 网关端,确保添加正确的路径并在所需的阶段发布资源。对于一些像路径参数(/user/{user_id})这样的url模式需要多加注意检查。

  2. 确保为此资源配置正确的options方法,因为有时是 CORS 导致此问题。

  3. 在 Lambda 端,确保指定正确的处理程序名称作为入口点。

  4. 请始终检查您的 lambda 的 cloudwatch 日志,以帮助您确定 lambda 方面的问题。

答案 11 :(得分:0)

当您调用错误的api端点时,通常会出现此错误。 检查您正在调用的api端点,然后在api网关上进行验证。

答案 12 :(得分:0)

作为记录,如果您不使用凭据,则在POST / PUT方法中将请求验证器设置为“验证正文,查询字符串参数和HEADERS”时,也会显示此错误”,或其他选项“验证查询字符串参数和HEADERS”。...在这种情况下,它将在标头上查找凭据并拒绝请求。综上所述,如果您不想发送凭据并希望使其保持打开状态,则不应在请求验证器中设置该选项(将其设置为NONE或验证正文)

答案 13 :(得分:0)

有时,当您调用错误的api时会显示此消息

检查您的api端点

答案 14 :(得分:0)

看起来(截至2019年4月),AWS API Gateway出于各种原因引发此异常-主要是在您遇到API Gateway无法访问的端点时(无论是因为未部署,还是在某些情况下)不支持该特定HTTP方法的地方。

我希望网关发送更合适的错误代码,例如不支持HTTP 405方法或找不到HTTP 404,而不是通用的HTTP 403禁止访问。

答案 15 :(得分:0)

贡献力量:

我有一个类似的错误,因为我的返回响应中没有这样的'body':

返回{ '状态代码':200, 'body':“如果替换,必须包含body标签,否则将不起作用” }

答案 16 :(得分:0)

我遇到了相同的问题,可以通过以下方法解决:

GET方法测试

https://54wtstq8d2.execute-api.ap-southeast-2.amazonaws.com/dev/echo/hello
Authorization tab -> 
•   select type(AWS signature)
•   Add AccessKey and SecretKey

答案 17 :(得分:0)

如果您为具有AmazonAPIGatewayInvokeFullAccess权限的服务器设置IAM角色,则仍需要在每个请求上传递标头。您可以使用aws-requests-auth库在python中执行以下操作:

import requests
from aws_requests_auth.boto_utils import BotoAWSRequestsAuth
auth = BotoAWSRequestsAuth(
    aws_host="API_ID.execute-api.us-east-1.amazonaws.com",
    aws_region="us-east-1",
    aws_service="execute-api"
)
response = requests.get("https://API_ID.execute-api.us-east-1.amazonaws.com/STAGE/RESOURCE", auth=auth)

答案 18 :(得分:0)

在我看来,这是很愚蠢的事情。 我已经习惯了使用POST创建新实体,并且由于“缺少身份验证令牌”而失败。我由于某种原因错过了它的定义,因为它可以正常工作。

答案 19 :(得分:0)

首先,检查您在lamda函数中创建的API是否已在您的AWS项目中注册。为此,请转到AWS控制台中的API网关。如果未注册,请注册。这是此问题的主要原因。

您甚至可以在 aws.export.js 文件中看到存在与API ['/items']相对应的路径。

您的API必须在那里,否则它不会将安全令牌附加到请求中。只需为此在控制台的项目云逻辑中注册它即可。

如果在那里,请使用上述解决方案
http://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-use-postman-to-call-api.html