0

I have created a Spring Security OAuth2 server using a example from https://github.com/royclarkson/spring-rest-service-oauth

The OAuth2 authentication request in CURL command is as below. I want the equivalent syntax in Angular2.

curl -X POST -vu clientapp:123456 http://localhost:8080/oauth/token -H "Accept: application/json" -d "password=spring&username=roy&grant_type=password&scope=read%20write&client_secret=123456&client_id=clientapp"

Here is what I tried:

import { Injectable } from '@angular/core';
import {Http, Headers, RequestOptions, RequestMethod} from '@angular/http';
import {Router} from '@angular/router';

@Injectable()
export class AuthService {
    isAuthenticated: boolean = false;
    userId;

    constructor(private http: Http, private router: Router) { }

    login(usercreds){
      let client_id = 'clientapp';
      let client_secret = '123456';
      var basicheader = btoa(client_id + ':' + client_secret);
      console.log(basicheader);
      var headers = new Headers();

      headers.append('Authorization', 'Basic' + basicheader);
      headers.append('Accept', 'application/json');
      headers.append('Content-Type', 'application/json');
      //let options = new RequestOptions( {method: RequestMethod.Post,   headers: headers });

      var creds = 'username=' + usercreds.username + '&password=' +  usercreds.password+'credentials=true&grant_type=password&scope=read%20write&client_secret=123456&client_id=clientapp';
      console.log(creds); 

     return new Promise((resolve) => {
        this.http.post('http://localhost:8080/oauth/token',    JSON.stringify(creds), {headers:headers}).subscribe((data) => {
        if(data.json().success) {
            this.userId = data.json().userId;      
            this.isAuthenticated = true;
        }
            resolve(this.isAuthenticated);
    })
  })
}
}

But when I launch this application the Google Chrome browser returns this error in developer mode:

  • XMLHttpRequest cannot load http://localhost:8080/oauth/token. Response for preflight has invalid HTTP status code 401
  • EXCEPTION: Response with status: 0 for URL: null

2 Answers 2

1

Found the reason for my Problem!

I just needed to end the filterchain and return the result immediatly if a OPTIONS request is processed by the CorsFilter! So, I added this class in the web service developed with spring oauth2 security.

SimpleCorsFilter.java

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class SimpleCorsFilter implements Filter {

   public SimpleCorsFilter() {}

   @Override
   public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
      HttpServletResponse response = (HttpServletResponse) res;
      HttpServletRequest request = (HttpServletRequest) req;
      response.setHeader("Access-Control-Allow-Origin", "*");
      response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
      response.setHeader("Access-Control-Max-Age", "3600");
      response.setHeader("Access-Control-Allow-Headers", "x-requested-with, authorization");

      if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
          response.setStatus(HttpServletResponse.SC_OK);
      } else {
          chain.doFilter(req, res);
     }
 }

  @Override
  public void init(FilterConfig filterConfig) {}

  @Override
  public void destroy() { }
}
Sign up to request clarification or add additional context in comments.

Comments

1

Use the code:

let headers = new Headers({
            "Content-Type": "application/x-www-form-urlencoded",
            "Accept": "application/json",
            "Authorization": "Basic " + btoa("yourclientid" + ':' + "yourclientsecret")
        });
let options = new RequestOptions({ headers: headers });

let data = "username=" + yourlogin + "&password=" + encodeURIComponent(yourpass) + "&grant_type=password&" +
            "client_secret=yoursecret&client_id=yourclientid";

return this.http.post("http://localhost:8080/oauth/token", data, options)
            .map(res => res.json());

Follow my file:

import { Injectable } from '@angular/core'
import { Resources } from '../../config/resources';
import { Http } from '@angular/http';
import { Headers, RequestOptions } from '@angular/http';

@Injectable()
export class LoginService {
    private urlLogin: string;

    constructor(private http: Http) {
        this.urlLogin = Resources.getUrlBackend() + "oauth/token";
    }

    public login(usuario) {

        let headers = new Headers({
            "Content-Type": "application/x-www-form-urlencoded",
            "Accept": "application/json",
            "Authorization": "Basic " + btoa("clientapp" + ':' + "springSecurity")
        });

        let options = new RequestOptions({ headers: headers });

        let client = "username=" + usuario.email + "&password=" + encodeURIComponent(usuario.senha) + "&grant_type=password&" +
            "client_secret=springSecurity&client_id=clientapp";

        return this.http.post(this.urlLogin, client, options)
            .map(res => res.json());
    }

}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.