How to invalidate 'expired' Firebase Instance ID Token

前端 未结 2 1868
情书的邮戳
情书的邮戳 2021-01-02 06:59

AFAIK, the Firebase Instance Token will be refreshed under the following 4 conditions:

  1. App deletes Instance ID

  2. App is restored on a new devi

2条回答
  •  温柔的废话
    2021-01-02 07:35

    As Frank mentioned in his answer you can remove them when sending messages and getting not registered error.

    Here how I delete outdated registration tokens when registering a new one using C#.

    First of all using Instance ID API I get token info as following:

     public async Task GetTokenInfoAsync(string token)
        {
            try
            {
                HttpClient client = new HttpClient();
    
                client.BaseAddress = new Uri("https://iid.googleapis.com");
                client.DefaultRequestHeaders.TryAddWithoutValidation("Authorization", String.Format("key={0}", "your-authorization-key"));
    
                var uri = $"/iid/info/{token}";
    
                var httpResponse = await client.GetAsync(uri);
                var responseStr = await httpResponse.Content.ReadAsStringAsync();
    
                if (httpResponse.StatusCode != HttpStatusCode.OK)
                {
                    //log 400 bad request and do whatever you want
                }
    
                var result = JsonConvert.DeserializeObject(responseStr);
                return result;
            }
            catch (Exception ex)
            {
                //log the exception
                throw;
            }
        }
    

    FCMTokenInfo.cs

    public class FCMTokenInfo
    {
        public string Application { get; set; }
        public string Subtype { get; set; }
        public string Scope { get; set; }
        public string AuthorizedEntity { get; set; }
        public string Platform { get; set; }
    }
    

    And then inside the service that saves registration tokens inside the database:

    //this method gets called when a new token is sent by the javascript web app
    public async Task AddTokenAsync(Guid accountId, string token)
        {
            try
            {
    
                //getting TokenInfo of the current token(or refreshed one for that app)
                var fcmTokenInfo = await firebaseServices.GetTokenInfoAsync(token);
    
                //adding the current token
                dbContext.FcmRegisterationTokens.Add(new FcmRegisterationToken
                {
                    Token = token,
                    AccountId = accountId,
                    AddingDate = DateTimeOffset.UtcNow,
                    Application = fcmTokenInfo.Application,
                    Subtype = fcmTokenInfo.Subtype,
                    AuthorizedEntity = fcmTokenInfo.AuthorizedEntity,
                    Scope = fcmTokenInfo.Scope,
                    Platform = fcmTokenInfo.Platform
                });
    
                var outdatedTokens = await dbContext.FcmRegisterationTokens
                                             .Where(x => x.AccountId == accountId
                                                      && x.Application == fcmTokenInfo.Application
                                                      && x.Platform == fcmTokenInfo.Platform
                                             ).ToListAsync();
    
               //remove them
                dbContext.FcmRegisterationTokens.RemoveRange(outdatedTokens);
    
                dbContext.SaveChanges();
            }
            catch (Exception)
            {
                 throw;
            }
    
        }
    

提交回复
热议问题