heroku,Fixieを使用したLineアプリケーションのプロキシ設定
heroku上にLineアプリケーションを構築しております。
その際に、Line APIへアクセスするためのIPを固定するためFixieをAddonとして登録しました。
ただ、Lineアプリケーションの動作にあたってFixieから提供されたIPアドレスが使用されず
Line APIにアクセスできません。
Proxyを使用するにあたって、下記のコードで何が問題なのかご教示ください。
内容としてはユーザの発言に対して、ユーザーIDの文字列を返すプログラムです。
ちなみに、Fixieから提供されたIPアドレスはポート24でLine developersのServer IP Whitelistに登録済みです。
また、一時的にServer IP WhitelistへherokuのIPアドレスを追加した場合は正常に動作するため、Proxy設定以外に問題はない認識です。
@SpringBootApplication
@LineMessageHandler
public class DemoApplication{
public static void main(String[] args) throws IOException {
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private LineMessagingService lineMessagingService;
@EventMapping
public void handleTextMessageEvent(MessageEvent<TextMessageContent> event) throws Exception {
String channelTtoken = System.getenv("LINE_BOT_CHANNEL_TOKEN");
String fixieUrl = System.getenv("FIXIE_URL");
String[] fixieValues = fixieUrl.split("[/(:\\/@)/]+");
String fixieUser = fixieValues[1];
String fixiePassword = fixieValues[2];
String fixieHost = fixieValues[3];
int fixiePort = Integer.parseInt(fixieValues[4]);
OkHttpClient.Builder clientBuilder = new OkHttpClient.Builder();
Authenticator proxyAuthenticator = new Authenticator() {
@Override public Request authenticate(Route route, Response response) throws IOException {
String credential = Credentials.basic(fixieUser, fixiePassword);
return response.request().newBuilder()
.header("Proxy-Authorization", credential)
.build();
}
};
Proxy prx = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(fixieHost, fixiePort));
clientBuilder.proxy(prx).proxyAuthenticator(proxyAuthenticator);
ReplyMessage replyMessage = new ReplyMessage(event.getReplyToken(),
Collections.singletonList(new TextMessage(event.getSource().getUserId())));
retrofit2.Response<BotApiResponse> response =
LineMessagingServiceBuilder
.create(channelTtoken)
.okHttpClientBuilder(clientBuilder)
.build()
.replyMessage(replyMessage)
.execute();
System.out.println("response: " + response.code() + " " + response.message());
final BotApiResponse apiResponse = lineMessagingService
.replyMessage(new ReplyMessage(event.getReplyToken(),
Collections.singletonList(new TextMessage(event.getSource().getUserId()))))
.execute().body();
System.out.println("Sent messages: " + apiResponse);
}
@EventMapping
public void defaultMessageEvent(Event event) {
System.out.println("event: " + event);
}
}
エラーメッセージは大量に出力されました。問題のエラーメッセージは以下だと思っています。
2017-07-27T15:24:31.472775+00:00 app[web.1]: 2017-07-27 15:24:31.472 INFO 4 --- [nio-6512-exec-5] com.linecorp.bot.client.wire : {"message":"Access to this API denied due to the following reason: Your ip address [54.211.114.123] is not allowed to access this API. Please add your IP to the IP whitelist in the developer center."}
以上、よろしくお願いいたします。