実現したいこと
異なるドメインへjsonをPOSTリクエストしたいです。
具体的には、サーバ"A"からレスポンスとしてjsonをブラウザで受け取り、それをサーバ"B"へPOST送信したいです。
条件詳細については以降に記載しますが、このような場合受信側サーバBがjsonデータをどのようなパラメータ名で受け取るかわからない限り、実現することはできないのでしょうか?
ブラウザ ====> 【サーバA】 ====> ブラウザ ====> 【サーバB】
上記実現の為の条件は以下の通りです。
・サーバ間で直接やり取りは行わず、UA(ブラウザ)を介してPOST通信を行う。
・サーバBはjsonを受け取れることしかわからない。(受取るkey名は不明である)
・サーバBでは、access-control-allow-originは許可されていない。
背景
OAuth2.0を学んでいるのですが、アクセストークン取得までに行うパラメータのやり取りに1つ疑問が浮かびました。
OAuth2.0ではHTTPS通信が前提の為、GETでやり取りしている所が多く見受けられますが、POST通信でも同様にjsonのやり取り(実際はJWTでしょうが...)ができるのか疑問に思い実践しています。
そもそもOAuthにおけるJWTはHTTPヘッダのAuthenticationフィールドに付加するものであり、前述のような考え自体が仕様に反している等、OAUthに関する指摘でも構いませんので、ご教授頂けると幸いです。
試したこと
サーバA及び疑似リダイレクトで使用するjsを実装対象としています。
html
1<!-- firstSend.html --> 2 3<form action="/redirect" method="post"> 4 <input type="hidden" id="result" value=""/> 5 <input type="submit"/> 6</form> 7<script> 8 document.addEventListener("DOMContentLoaded",()=>{ 9 var data={name: "名前", age:100}; 10 let json = JSON.stringify(data); 11 const xhr = new XMLHttpRequest(); 12 xhr.open("POST","/send"); 13 14 xhr.setRequestHeader('content-type','application/json;charset=UTF-8'); 15 xhr.onreadystatechange = function(){ 16 if(xhr.readyState === 4){ 17 if(xhr.status === 200){ 18 console.log("OK"); 19 let input = document.getElementById("result"); 20 input.value = xhr.responseText; 21 //window.location.href = "localhots:8080/redirect"; 22 document.forms[0].submit(); 23 } 24 }else{ 25 console.log("通信中"); 26 } 27 }; 28 xhr.send(encodeURIComponent(json)); 29 }); 30</script>
java
1//サーバAに相当 2 3@PostMapping(value="/send", consumes = "application/json") 4@ResponseBody 5public String ajax(HttpServletRequest req, HttpServletResponse res){ 6 String data = null; 7 StringBuilder sb = new StringBuilder(); 8 try{ 9 BufferedReader br = req.getReader(); 10 while((data = br.readLine())!= null){ 11 sb.append(data); 12 } 13 }catch(IOException e){ 14 e.printStackTrace(); 15 } 16 17 data = new URLDecoder().decode(sb.toString(),StandardCharsets.UTF_8); 18 Gson gson = new Gson(); 19 Type type = new TypeToken<Map<String,Object>>(){}.getType(); 20 Map<String,Object> map = gson.fromJson(data,type); 21 map.entrySet().stream().forEach(e->{ 22 System.out.print(e.getKey()+":"); 23 System.out.println(map.get(e.getKey())); 24 }); 25 map.put("sex","male"); 26 String result = gson.toJson(map); 27 28 return result; 29}
java
1//サーバBに相当 2 3@PostMapping(value="/redirect") 4public String receive(HttpServletRequest req, HttpServletResponse res){ 5 //jsonを取得する処理。サーバBではあくまでjsonを取得していることしかわからない。 6
環境
java OpenJDK-12
Spring Boot 2.1.8
回答1件
あなたの回答
tips
プレビュー