Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular2 get url query parameters

I'm setting up a Facebook registration for my Angular2 web app. Once the application accepted via Facebook (after being redirected to the Facebook authorization page), it redirect to my webapp with the token and code as url params:

http://localhost:55976/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE

But once the page is loaded, the params are removed. The url become:

http://localhost:55976/

How can I extract the parameters (access_token and code) before they are removed? My routing configuration contains:

{ path: 'login', component: LoginComponent },
{ path: 'login/:access_token/:code', component: LoginComponent },

EDIT:

Here is how I redirect to facebook in my login.component: html:

<a class="btn btn-social btn-facebook socialaccount_provider facebook" title="Facebook" href="#" (click)="login_facebook()">
    <span class="fa fa-facebook"></span> <span style="padding-left:25px">Sign in with Facebook</span>
</a>

Typescript:

login_facebook() {
    let url = 'https://www.facebook.com/dialog/oauth?'+
        'client_id=my_client_id' +
        '&redirect_uri=' + encodeURIComponent('http://localhost:55976/#/login/') +
        '&response_type=code%20token';
    console.log(url);
    window.location.href = url;
}

The facebook api redirect to http://localhost:55976/#/login/, this is where I try to get the access_token and code parameters.

EDIT 2:

If I remove the sharp in the redirect url, facebook redirect me to the good URL, but without the sharp, angular cannot resolve the url.

Before removing '#':

redirect_uri: http://localhost:55976/#/login/
facebook return: http://localhost:55976/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE

After removing '#':

redirect_uri: http://localhost:55976/login/
facebook return: http://localhost:55976/login/?#access_token=MY_ACCESS_TOKEN&code=MY_CODE

That mean that the problem comes from the sharp. But without the sharp, angular returns HTTP Error 404.0 - Not Found.

like image 338
Ben Avatar asked Sep 23 '16 20:09

Ben


People also ask

How do I get query parameters in Angular 10?

Use queryParamMap to access query parameters. Another way to access query paramters in Angular is to use queryParamMap property of ActivatedRoute class, which returns an observable with a paramMap object.

How do I get the URL query parameters in react?

To capture url parameters use window object. You can use "useLocation" from "react-router-dom" instead of window object to achieve same results.

CAN GET method have query parameters?

When the GET request method is used, if a client uses the HTTP protocol on a web server to request a certain resource, the client sends the server certain GET parameters through the requested URL. These parameters are pairs of names and their corresponding values, so-called name-value pairs.


4 Answers

You're looking for query parameters from ActivatedRoute.

To receive them, you could put them into your component's OnInit function like this:

private accesstoken; private code;  constructor(private route: ActivatedRoute) { }  ngOnInit() {   // Capture the access token and code   this.route       .queryParams       .subscribe(params => {           this.accesstoken = params['#access_token'];           this.code = params['code'];       });    // do something with this.code and this.accesstoken } 

There's more examples in the link I put above. You may have problems with angular because the router also identifies fragments, which start with the #... If angular does identify it as a fragment, then you can just subscribe to the fragment observable from ActivatedRoute and do it that way.

I'm not sure if you're being redirected. If you are, the could look into using the preserveQueryParams navigation option, something like this.

this.router.navigate([redirect], {preserveQueryParams: true}); 
like image 53
Federico Pettinella Avatar answered Oct 04 '22 20:10

Federico Pettinella


Here is my final working code:

Imports:

import { Router, NavigationCancel } from '@angular/router'; import { URLSearchParams, } from '@angular/http'; 

Constructor:

 constructor(public router: Router) {     router.events.subscribe(s => {       if (s instanceof NavigationCancel) {         let params = new URLSearchParams(s.url.split('#')[1]);         let access_token = params.get('access_token');         let code = params.get('code');       }     });   } 
like image 39
Ben Avatar answered Oct 04 '22 21:10

Ben


using Javascript :

(new URL(location)).searchParams.get("parameter_name")
like image 32
Jay Shah Avatar answered Oct 04 '22 20:10

Jay Shah


getQueryParams( locationSearch: string):any {
    let params = {};
    if( locationSearch ) {
        locationSearch = locationSearch.split('?')[1];
        let splited = locationSearch.split('&');
        for( let i = 0; i < splited.length; i++ ) {
            let propName = splited[i].split('=')[0];
            let propValue = splited[i].split('=')[1];
            params[propName] = propValue;
        }
    }

    return params;
}

let q = getQueryParams( location.search );
like image 38
ame Avatar answered Oct 04 '22 21:10

ame