My app uses Facebook Javascript SDK authorization on client side, and for authorized user app fetches access token from Facebook API, using facebook cookie with signed request and provided code, and store it into database.
Everything is working fine, but i’m wondering, when I should refresh stored access token? What if user have changes password, and have signed in/connected again.
As I understand, now she has new access token, and app should load it from Facebook. But how I can understand when I should check for a new token? Check on each request with facebook cookie doesn’t work, because it’s few request per second for each user (event if she didn’t change a password). Or maybe i’m doing something wrong?
I mean:
- I’ve authorized user on client side
- I’ve cookie with signed request
- Signed request is pretty enough to authorize user on server side (validate user credentials)
- I can get
access tokenby calling Facebook API, anytime when user user makes request to my app (because I need acodefrom signed request). So, i’m doing it when I don’t have storedaccess tokenor existingaccess tokenhas expired. access tokenjust stored in database, and can be used anytime, in different thread, maybe few minutes later (mean we don’t have user request and cookie with signed request)- What if stored
access tokennot expired, but invalidated on facebook side? I need to fetch newaccess token, but cookie has gone at this moment.
Currently I see only one way: store code from signed request into databse, and when we have found that we have invalid access token, try to load it. But i’m note sure that it’s proper way, and not so much usable for most cases
You have client token and server token, the client one is short lived (a few hours) and the server one is long lived (60 days).
The token on the client side should not bother you too much since you can get a new one easily as it states in the “Handling Invalid and Expired Access Tokens” guide:
The token on the server side, which you persist in the db, can not be as easily reproduced, the user has to be sent to the auth dialog again:
You can of course send a client token to the server and persist that, but it’s pretty pointless since it’s short lived.
Another option is to use the new endpoint to extend a valid client token on the server side and then persisting that.
As for “how to know when do get a new token”, on the server side when you are making api requests just check the response and see if an error returned and if so what it is (there’s a list in the first url I added).
If the token has expired then just send the user to the auth dialog again (you can return some kind of code to the client side and do it from there) and then save the new token to the db.
There’s no need to check cookies, those are used in the background but you should not have anything to do with them.
Edit
Don’t use the cookies, they should not concern you at any time.
What you should do:
On the server side you should follow the instructions in the Server-Side auth guide, get the “code” and exchange it with a token.
That token will have 60 days.
Use that token, which you store in your db, as needed (other threads, what not) and when you are getting an error back from facebook saying that the token has expires just navigate the user back to the auth dialog page.
You can not use the “code” to get more than one token so that won’t help you.
If the user session (and token) got invalidated (for various reasons) you will still get an error back from facebook when trying to make an api request, when that happens just send the user to the auth dialog again.