简体   繁体   中英

Save and Load Facebook user access token

I know this is a silly question but how can I easily save the user access token after a user logs in?

Here is a part of my code that is triggered by a button:

public class FacebookLogin : MonoBehaviour {


void Awake()
{
    if (!FB.IsInitialized)
    {
        FB.Init(InitCallback, OnHideUnity);
    }
    else
    {
        FB.ActivateApp();
    }
}

private void InitCallback()
{
    if (FB.IsInitialized)
    {
        FB.ActivateApp();
    }
    else
    {
        Debug.Log("Failed to Initialize the Facebook SDK");
    }
}

private void OnHideUnity(bool isGameShown)
{
    if (!isGameShown)
    {
        Time.timeScale = 0;
    }
    else
    {
        Time.timeScale = 1;
    }
}

public void FBLogin()
{
    List<string> perms = new List<string>() { "public_profile", "email", "user_friends" };
    FB.LogInWithReadPermissions(perms, AuthCallback);
}

private void AuthCallback(ILoginResult result)
{
    if (FB.IsLoggedIn)
    {
        var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;

        FB.API("/me?fields=first_name", HttpMethod.GET, getName);
        FB.API("/me/picture?type=square&height=128&width=128", HttpMethod.GET, getProfilePic);
        SceneManager.LoadScene("Main_Menu");
    }
    else
    {
        Debug.Log("User cancelled login");
    }
}

private void getName(IResult result)
{
    LocalDataBase.Name = result.ResultDictionary["first_name"].ToString();
}

private void getProfilePic(IGraphResult result)
{
    LocalDataBase.profilePicture = result;
}

}

Thank you in advance for all your answers.

You can save the token by making a custom serializable class that wraps around all the variables inside Facebook's AccessToken class. This custom class should contain a function that can be used to convert its data into Facebook's AccessToken class.

You can then save and load that custom class as Json.

Grab DataSaver class from this post to simplify saving and loading the data. We will call our custom class FaceBookToken .

Your Facebook Token:

var aToken = Facebook.Unity.AccessToken.CurrentAccessToken;

Save :

FaceBookToken faceBookToken = FaceBookToken.createFaceBookToken(aToken);
DataSaver.saveData(faceBookToken, "FB_Token");

Load :

FaceBookToken loadedFaceBookToken = DataSaver.loadData<FaceBookToken>("FB_Token");
//AccessToken loadedToken = loadedFaceBookToken.toAccessToken(); //OR
AccessToken loadedToken = loadedFaceBookToken;

Apply Loaded Data :

Facebook.Unity.AccessToken.CurrentAccessToken = loadedToken;

Don't know if applying it is possible or allowd but it seems to compile without problems.

Delete :

DataSaver.deleteData("FB_Token");

The FaceBookToken custom class:

[Serializable]
public class FaceBookToken
{
    public static AccessToken CurrentAccessToken;
    public DateTime ExpirationTime;
    public DateTime? LastRefresh;
    public IEnumerable<string> Permissions;
    public string TokenString;
    public string UserId;

    //Function that let's you easily create new instance of FaceBookToken from AccessToken
    public static FaceBookToken createFaceBookToken(AccessToken currentToken)
    {
        FaceBookToken faceBookToken = new FaceBookToken();
        FaceBookToken.CurrentAccessToken = AccessToken.CurrentAccessToken;
        faceBookToken.ExpirationTime = currentToken.ExpirationTime;
        faceBookToken.LastRefresh = currentToken.LastRefresh;
        faceBookToken.Permissions = currentToken.Permissions;
        faceBookToken.TokenString = currentToken.TokenString;
        faceBookToken.UserId = currentToken.UserId;
        return faceBookToken;
    }

    //Converts our custom FaceBookToken to AccessToken
    public AccessToken toAccessToken()
    {
        AccessToken loadedToken = new AccessToken(TokenString, UserId,
            ExpirationTime, Permissions, LastRefresh);
        return loadedToken;
    }

    //Converts our custom FaceBookToken to AccessToken(Implicit Cast)
    public static implicit operator AccessToken(FaceBookToken currentToken)
    {
        AccessToken loadedToken = new AccessToken(currentToken.TokenString, currentToken.UserId,
             currentToken.ExpirationTime, currentToken.Permissions, currentToken.LastRefresh);
        return loadedToken;
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM