如何使用API​​网关访问受保护的后端API?

时间:2017-06-25 12:21:46

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

我创建了一个后端spring-boot REST api,它部署在使用JWT进行身份验证的EC2上。所以,我首先要获得持票人令牌:

package problems;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

public class SortByFrequency {

    public static void main(String args[]) {
        int arr[] = { 2, 5, 2, 6, -1, 9999999, 5, 8, 8, 8 };
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int len = arr.length;
        for (int j = 0; j < len; j++) {
            if (map.get(arr[j]) == null) {
                map.put(arr[j], 1);
            } else {
                map.put(arr[j], (Integer) map.get(arr[j]) + 1);
            }
        }

        Set<Entry<Integer, Integer>> set = map.entrySet();
        ArrayList<Entry<Integer, Integer>> list = new ArrayList<Entry<Integer, Integer>>(set);
        list.sort(new Comparator<Entry<Integer, Integer>>() {
            @Override
            public int compare(Entry<Integer, Integer> o1, Entry<Integer, Integer> o2) {
                if (o1.getValue() < o2.getValue()) {
                    return 1;
                } else if (o1.getValue() > o2.getValue()) {
                    return -1;
                } else if (o1.getValue() == o2.getValue()) {
                    if (o1.getKey() < o2.getKey()) {
                        return 1;
                    } else {
                        return -1;
                    }
                }
                return 0;
            }
        });
        for (Map.Entry<Integer, Integer> en : list) {
            int val = en.getValue();
            while(val!=0){
            System.out.println(en.getKey());
            val--;          
            }
        }
    }

}

然后进行REST调用以访问我的REST资源

curl -iH "Content-Type: application/json" -X POST -d '{"username":"myusername", "password":"mypassword"}' http://123.45.6782.910:8080/login

一切正常。

现在,我想使用API​​网关访问curl -H "Authorization: eyJhbGzd9.NYHXPv-vXUIoNr7qtA" http://123.45.6782.910:8080/categories/pets/ 资源。

我已经设置了GET - 方法执行的方法请求,集成请求部分。但是,当我尝试测试设置时,我得到403。

/categories/pets/

我认为这是预料之中的,因为我直接尝试在没有持票人令牌的情况下访问后端api。我想知道如何在{ "timestamp": 1498392625274, "status": 403, "error": "Forbidden", "message": "Access Denied", "path": "/categories/pets/" } 上执行POST以获取承载令牌,然后拨打http://123.45.6782.910:8080/login

更新:根据@KaHouIeong的建议,我在API网关上创建了一个POST端点/登录来获取持票令牌。当我在API网关的测试控制台中测试时,我得到了/categories/pets/但是当我从邮递员那里尝试时,我得到状态200 OK但不是Authorization →Bearer eyJhbGzd9令牌。

Authorization →Bearer eyJhbGzd9

1 个答案:

答案 0 :(得分:3)

您的客户应向/login发送请求并从响应中获取持有者令牌,然后重新使用令牌访问您的/categories/pets/ API。 工作流程应与您直接点击EC2后端相同。

对于API网关上的API设置,您需要设置/login资源并指向http://123.45.6782.910:8080/login

然后,您需要设置集成响应标头映射以将Authorization标头映射回方法响应,然后API网关将通过标头传递给客户端。

integration.response.header.Authorization -> method.response.header.Authorization