2016-12-29 2 views
1

Я пытаюсь выполнить аутентификацию в Microsoft OneDrive с помощью службы REST в своем приложении с использованием Java для бэкэнд и Ionic 2. Теперь аутентификация работает, если я вызываю свое обслуживание непосредственно из Chrome , я отправляю код:Аутентификация служб Microsoft OneDrive REST Java/Ionic 2

private static final String REDIRECT_URI = "http://localhost:8080/CloudToCloud/onedrive/getToken"; 

@RequestMapping(value = { "/getAccess" }, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public void authorizationFlow(HttpServletRequest request, HttpServletResponse response) 
     throws IOException, InterruptedException { 
    try { 
     String authURL = "https://login.live.com/oauth20_authorize.srf?client_id=" + CLIENT_ID 
       + "&scope=wl.signin%20wl.basic%20wl.offline_access%20wl.skydrive_update&response_type=code&redirect_uri=" 
       + REDIRECT_URI; 
     response.sendRedirect(authURL); 
    } catch (Exception e) { 
     logger.severe(e.getMessage()); 
    } 
} 

@RequestMapping(value = { "/getToken" }, params = { "code" }, method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) 
public ResponseEntity<JSONObject> getToken(@RequestParam("code") String code) 
     throws IOException, InterruptedException, ParseException { 
    JSONObject json = null; 
    try { 
     logger.info("Auth CODE: " + code); 
     String url = "https://login.live.com/oauth20_token.srf"; 
     URL obj = new URL(url); 
     HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 

     con.setRequestMethod("POST"); 
     con.setRequestProperty("User-Agent", "Mozilla/5.0"); 
     con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 

     String urlParameters = "client_id=" + CLIENT_ID + "&" + "redirect_uri=" + REDIRECT_URI + "&" 
       + "client_secret=" + SECRET + "&" + "code=" + code + "&" + "grant_type=authorization_code"; 
     logger.info(url + urlParameters); 

     con.setDoOutput(true); 
     DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
     wr.writeBytes(urlParameters); 
     wr.flush(); 
     wr.close(); 

     int responseCode = con.getResponseCode(); 
     logger.info("REQUEST SENT. Response Code : " + responseCode); 

     BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); 
     String inputLine; 
     StringBuffer response = new StringBuffer(); 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
     String risposta = response.toString(); 
     JSONParser parser = new JSONParser(); 
     json = (JSONObject) parser.parse(risposta); 
     String token = json.get("access_token").toString(); 

     FileWriter file = new FileWriter(DATA_STORE_DIR); 
     file.write(json.toJSONString()); 

     logger.info("\nTOKEN:\n" + token); 

     file.flush(); 
     file.close(); 
     return new ResponseEntity<JSONObject>(json, HttpStatus.OK); 
    } catch (Exception e) { 
     logger.info("ERRORE: " + e.getMessage()); 
     return new ResponseEntity<JSONObject>(HttpStatus.BAD_REQUEST); 
    } 
} 

я называю первый сервис, я получаю код, и я делаю редирект на второй сервис, который предоставляет мне JSON с маркером, который будет использоваться для всех других вызовов , До этого все работает. Проблема возникает с помощью Ионные 2. Я отправляю код:

Услуга:

getAuthOneDrive(){ 
    var url = 'http://localhost:8080/CloudToCloud/onedrive/getAccess'; 
    var response = this.http.get(url).map(res => res.json()); 
    return response; 
} 

Компонент:

getAuthOneDrive(){ 
    this.cloudServiceAuthentication.getAuthOneDrive().subscribe(
    err => { 
     console.log(err); 
    }, 
    () => console.log('getAuthOneDrive Complete') 
); 
} 

И мой прокси, что я настроил в ionic.config .json:

{ 
    "name": "C2C", 
    "app_id": "c6203dd8", 
    "v2": true, 
    "typescript": true, 
    "proxies": [ 
    { 
     "path": "/", 
     "proxyUrl": "http://localhost:8080/" 
    } 
    ] 
} 

Если я пытаюсь вызвать ту же услугу (http://localhost:8080/CloudToCloud/onedrive/getAcces), из приложения в Ionic2, щелкнув по кнопке, я получаю эту ошибку.

XMLHttpRequest cannot load http://localhost:8080/CloudToCloud/onedrive/getAccess. Redirect from 'http://localhost:8080/CloudToCloud/onedrive/getAccess' to 'https://login.live.com/oauth20_authorize.srf?client_id=ae9573ba-6bc0-4a87-8…ype=code&redirect_uri=http://localhost:8080/CloudToCloud/onedrive/getToken' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://localhost:8100' is therefore not allowed access. 

Я действительно пробовал все. Если кто-то сможет мне помочь, я буду благодарен. Благодаря! ;)

EDIT:

Это то, что я пытался сделать: 1- надстройку « 'Access-Control-Allow-Origin', '*' заголовок, я получил эту ошибку:

XMLHttpRequest cannot load http://localhost:8080/CloudToCloud/onedrive/getAccess. Redirect from 'http://localhost:8080/CloudToCloud/onedrive/getAccess' to 'https://login.live.com/oauth20_authorize.srf?client_id=ae9573ba-6bc0-4a87-8…ype=code&redirect_uri=http://localhost:8080/CloudToCloud/onedrive/getToken' has been blocked by CORS policy: Request requires preflight, which is disallowed to follow cross-origin redirect. 

2- не использует response.sendRedirect в первых услугах, но удовлетворить запрос с HttpsURLConnection или Spring RestTemplate; 3- пытается вызвать службу Microsoft непосредственно из ионических; 4- использовать Spring аннотацию @ CrossOrigin, но у меня такая же ошибка.

ответ

0

Я решил, изменив первый сервис/getAccess, добавив заголовок Access-Control-Allow-Origin и используя мой REDIRECT_URI и уже не sendRedirect, который дал проблемы.

@CrossOrigin(origins = "*") 
@RequestMapping(value = { "/getAccess" }, method = RequestMethod.GET) 
public void authenticate() throws IOException { 
    try { 
     OneDriveSDK sdk = OneDriveFactory.createOneDriveSDK(CLIENT_ID, SECRET, REDIRECT_URI, 
       OneDriveScope.READWRITE); 
     String url = sdk.getAuthenticationURL(); 
     logger.info(url); 
     openWebpage(url); 
     URL obj = new URL(url); 
     HttpsURLConnection con = (HttpsURLConnection) obj.openConnection(); 
     con.setRequestMethod("GET"); 
     con.setRequestProperty("Access-Control-Allow-Origin", "*"); 
     con.setDoOutput(true); 
     int responseCode = con.getResponseCode(); 
     logger.info("REQUEST SENT. Response Code : " + responseCode); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
0

Запросы на перекрестный поиск ограничены браузером по соображениям безопасности. Взгляните на HTTP access control (CORS) для подробного объяснения того, как это работает.

Установка следующий заголовок позволит вам обойти эту проблему в развитии:

Access-Control-Allow-Origin: * 

Просто убедитесь, что вы удалите этот заголовок (или, по крайней мере, ограничить его пределами «*») в развертывании производства.

+0

Если добавить этот заголовок, который уже пытался сделать, я получаю эту ошибку: «XMLHttpRequest не может загрузить https://login.live.com/oauth20_authorize.srf?client_id=ae9573ba-6bc0-4a87- 8 ... ype = code & redirect_uri = http: // localhost: 8080/CloudToCloud/onedrive/getToken. Нет заголовок «Access-Control-Allow-Origin» присутствует в запрошенном ресурсе. Поэтому исходный «null» не имеет доступа ». Я думаю, причина в том, что служба Microsoft не принимает этот заголовок. –

Смежные вопросы