AWS Lambda验证移动应用程序发送的用户令牌?

时间:2017-06-03 10:05:30

标签: amazon-web-services aws-lambda amazon-cognito

我正在使用亚马逊移动中心构建移动应用。我在MobileHub中使用AWS Cognito通过注册和登录对用户进行身份验证。我现在正尝试使用AWS Lambda与DynamoDB进行通信以执行某些操作。

在这样做时,我偶然发现了一个问题,即我不确定如何验证用户。从某种意义上说,如果我通过Cloud Logic将访问令牌发送到我的Lambda函数,我将如何验证该令牌并使用从该令牌检索到的用户名继续我的操作?

此SDK允许Lambda函数与AWS Cognito功能进行通信,但我没有找到任何有用的函数来实际验证令牌。 https://github.com/aws/amazon-cognito-identity-js

2 个答案:

答案 0 :(得分:1)

您可以在 AWS apigateway 中使用Custom Authorizers授权 API请求。 访问令牌可以作为所有经过身份验证的API的请求标头发送,当它到达API网关时,自定义授权器逻辑将调用,因此将调用lambda函数并且可以验证访问令牌。 以下是自定义授权程序的example

答案 1 :(得分:1)

因此,在使用Cognito进行授权时,您有两种选择。

1)您可以将Cognito授权程序附加到API,其中"只是工作",在引擎盖下验证令牌。您无法控制授权流程,它基本上是“是”还是“否”。

2)正如prateek所说,你可以使用自定义授权器,有点像这样,注意:我把密钥放在代码中这是一个非常糟糕的主意,你应该将其存储在KMS加密的环境变量中。

import jwt from 'jsonwebtoken'

export default (event, context, callback) => {

    const key = '' // <--- YOU GET THIS KEY FROM https://cognito-idp.{region}.amazonaws.com/{userPoolId}/.well-known/jwks.json.
    jwt.verify(event.authorizationToken, key, (err, decoded) => {
        if (err) {
            console.log('JWT VALIDATION ERROR')
            callback(null, responder.unAuthorised())
            return
        }

        const principalId = decoded.user.username

        const apiOptions = {}
        const tmp = event.methodArn.split(':')
        const apiGatewayArnTmp = tmp[5].split('/')
        const awsAccountId = tmp[4]
        apiOptions.region = tmp[3]
        apiOptions.restApiId = apiGatewayArnTmp[0]
        apiOptions.stage = apiGatewayArnTmp[1]
        const method = apiGatewayArnTmp[2]
        let resource = '/' // root resource
        if (apiGatewayArnTmp[3]) {
            resource += apiGatewayArnTmp[3]
        }

        const policy = new AuthPolicy(principalId, awsAccountId, apiOptions)

        // DENY
        policy.denyMethod(AuthPolicy.HttpVerb.POST, "/someEndpoint")

        // PERMIT
        policy.allowMethod(AuthPolicy.HttpVerb.POST, "/someEndpoint")    

        const authResponse = policy.build()

        // YOU CAN EMBED ANYTHING ELSE YOU WANT TO ADD LIKE SO:
        authResponse.context = {
            username: decoded.username,
            someKey: someInfo,
        }

        callback(null, authResponse)

    }) //  jwt.verify(
}

我无法记住Cognito在其令牌中放置的内容,但在您jwt.verify只是控制台记录解码后的令牌并且您将看到来自您的用户池的大量信息后,您可以通过在authResponse.context中,它会在你的lambda中出现在event.requestContext.authorizer下。

请记住,身份令牌是包含用户池信息的身份令牌。