FCM выдает 401 через некоторое время для уведомления о сообщении с данными - PullRequest
0 голосов
/ 30 мая 2020

Я отправляю уведомление о сообщении с данными с сервера приложений Java в конечную точку покоя FCM. Все работает нормально, сообщения с данными принимаются приложением без каких-либо проблем, однако через некоторое время (без какой-либо заметной тенденции) звезды FCM возвращают 401. Я использую библиотеку HTTPClient Apache common для выполнения HTTP-вызовов. Это соответствующий фрагмент кода

final HttpPost httpPost = new HttpPost("https://fcm.googleapis.com/v1/projects/proj1/messages:send");
httpPost.setHeader("Content-Type", "application/json");
httpPost.setHeader("Authorization", "Bearer "+ accessToken);
responseBody = httpclient.execute(httpPost, responseHandler);

И этот фрагмент предназначен для получения токена доступа для авторизации API

 static{
             FileInputStream refreshToken = null;
             refreshToken = new FileInputStream("C:/prj/proserviceaccoutkey.json");
             googleCredentials=GoogleCredentials.fromStream(refreshToken).createScoped("https://www.googleapis.com/auth/firebase.messaging");
             options = new FirebaseOptions.Builder() .setCredentials(googleCredentials).build();
    }

// Gets called each time a data message needs to be sent
  public static synchronized String getAccessToken()
    {
        if(googleCredentials.getAccessToken()==null)
            try {
                googleCredentials.refresh();
            } catch (IOException e) {
                e.printStackTrace();
            }
        return googleCredentials.getAccessToken().getTokenValue();
    }

1 Ответ

0 голосов
/ 31 мая 2020

похоже, что googleCredentials.getAccessToken () всегда будет возвращать ненулевое значение, даже если токен cahce больше не действителен, и поэтому токен не обновлялся в коде. Применено следующее исправление, и теперь оно работает.

public static synchronized String getAccessToken()
    {
        if(googleCredentials!=null)
            try {
                googleCredentials.refresh();
            } catch (IOException e) {
                e.printStackTrace();
            }
        return googleCredentials.getAccessToken().getTokenValue();
    }

Хотя на самом деле он не использует кэшированный токен, так как каждый раз он будет обновлять токен, но моя проблема на данный момент решена.

...