Получить пользователя Firebase, используя токен, из приложения Google Cloud, работающего локально - PullRequest
0 голосов
/ 11 января 2019

Я работаю над API Java, который функционирует как API конечной точки, и над производством. он работает на облачной платформе Google. Методы API вызываются передачей токена Firebase как части URL-адреса, и этот токен используется для создания User, доступного внутри метода API:

@ApiMethod(path = "myPath/{tokenId}/doSomething", httpMethod = "get")
    public ResponseMessage ReturnSomething(@Named("tokenId") String tokenId, User user) throws UnauthorizedException, BadRequestException, InternalServerErrorException, FirebaseAuthException  
    {
        if (user == null)
        ...

В работе, когда URL вызывается из приложения Angular на Firebase, которое передает токен в URL, user создается правильно. Я не совсем понимаю, как User создается из токена, я только знаю, что это как-то происходит «автоматически» в рамках интеграции Firebase с Google Cloud.

Я хочу отладить API локально, используя Debug As> App Engine изнутри Eclipse. Однако, когда я делаю это и вызываю API из моего локального приложения Angular, работающего с использованием Firebase serve, токен правильно передается моему локально работающему API, однако user всегда null.

@ApiMethod(path = "myPath/{tokenId}/doSomething", httpMethod = "get")
    public ResponseMessage ReturnSomething(@Named("tokenId") String tokenId, User user) throws UnauthorizedException, BadRequestException, InternalServerErrorException, FirebaseAuthException  
    {
        if (user == null)
        // this is always null

Я подозреваю, что это проблема с моим локально работающим Java API, правильно проходящим аутентификацию в Firebase. Я посмотрел на это руководство , в котором говорится, что для свойства GOOGLE_APPLICATION_CREDENTIALS в Windows необходимо указать путь к ключу JSON учетной записи службы App Engine по умолчанию, что является нормальным способом гарантировать, что локальный доступ предоставляется ресурсам Google Cloud (и предположительно Firebase).

Я добавил это явно (я все равно уже запускал gcloud auth application-default login, используя командную строку), однако он все еще не работает. Я просто получаю null за user, и нет никаких признаков того, что происходит. Я не хочу проводить программную аутентификацию, поскольку это означает изменение кода API для другой аутентификации во время отладки. Как получить User при локальной отладке как App Engine?

UPDATE

Я понял, что хотя tokenId в URL присутствует, я получаю следующую ошибку при вызове API:

WARNING: Authentication failed: com.google.api.auth.UnauthenticatedException: No auth token is contained in the HTTP request

Значение tokenId в приведенном ниже коде является допустимым значением, поэтому я не уверен, почему я получаю это сообщение:

@ApiMethod(path = "myPath/{tokenId}/doSomething", httpMethod = "get")
    public ResponseMessage ReturnSomething(@Named("tokenId") String tokenId, User user)

1 Ответ

0 голосов
/ 14 января 2019

Я обнаружил, что это на самом деле проблема с библиотекой Auth0 , которая используется в Angular для поддержки аутентифицированных HTTP-запросов к API Java. Библиотека Auth0 используется для вставки токена аутентификации в Bearer заголовка запроса всякий раз, когда Angular http.get вызывается из приложения Angular. Создание User зависит от того, присутствует ли это свойство в заголовке HTTP , и его значение установлено в значение токена аутентификации.

Я исправил это, изменив конфигурацию для этой библиотеки. Мне нужно было временно внести белый список localhost для порта (8080), на котором работает API, чтобы позволить Auth0 вставлять токен в заголовок HTTP при каждом запросе к localhost:8080

const jwtConf: JwtModuleOptions = {
  config: {
    tokenGetter: getToken,
    whitelistedDomains: ['localhost:8080']
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...