So I am trying to use JSON web tokens for authentication and am struggling trying to figure out how to attach them to a header and send them on a request.
I was trying to use https://github.com/auth0/angular2-jwt but I could not get it working with Angular and gave up, and figured I could just figure out how to either send the JWT in every request or send it in the header(preferably the header). It's just been a little bit harder than I thought it would be.
Here is my Login
submitLogin(username, password){
console.log(username);
console.log(password);
let body = {username, password};
this._loginService.authenticate(body).subscribe(
response => {
console.log(response);
localStorage.setItem('jwt', response);
this.router.navigate(['UserList']);
}
);
}
and my login.service
authenticate(form_body){
return this.http.post('/login', JSON.stringify(form_body), {headers: headers})
.map((response => response.json()));
}
I know these are not really needed but maybe it'd help! Once this token gets created and I store it, I would like to do 2 things, send it in the header and extract the expiration date that I put in with this.
Some of the Node.js login code
var jwt = require('jsonwebtoken');
function createToken(user) {
return jwt.sign(user, "SUPER-SECRET", { expiresIn: 60*5 });
}
Now I am just trying to pass it via an angular service back to node with this service.
getUsers(jwt){
headers.append('Authorization', jwt);
return this.http.get('/api/users/', {headers: headers})
.map((response => response.json().data));
}
JWT is my webtoken in local storage that I pass through my component to the service.
I get no errors anywhere but when it gets to my node server I never receive it in the header.
'content-type': 'application/json',
accept: '*/*',
referer: 'http://localhost:3000/',
'accept-encoding': 'gzip, deflate, sdch',
'accept-language': 'en-US,en;q=0.8',
cookie: 'connect.sid=s%3Alh2I8i7DIugrasdfatcPEEybzK8ZJla92IUvt.aTUQ9U17MBLLfZlEET9E1gXySRQYvjOE157DZuAC15I',
'if-none-match': 'W/"38b-jS9aafagadfasdhnN17vamSnTYDT6TvQ"' }
Here is an example from Angular code to get plans for instance, you just write it like this,
and on your server, you can do this,
If you are still not clear, you can check out the details on my blog post here, Node API Authentication with JSON Web Tokens - the right way.
I see several options to set an header transparently for each request:
This way you could set your header in one place and this would impact aok your HTTP calls.
See the following questions:
Create custom http class and override the
request
method to add the token in every http request.http.service.ts
Now, we need to configure our main module to provide the XHRBackend to our custom http class. In your main module declaration, add the following to the providers array:
app.module.ts
After that, you can now use your custom http provider in your services. For example:
user.service.ts
Source