Как поддерживать автоматический вход в систему с использованием файлов cookie сеанса с angular2 и nativescript - PullRequest
0 голосов
/ 25 апреля 2019

Я внедряю приложение для Android / IOS в NativeScript на Angular2.Я хотел бы сохранить учетные данные для входа в систему при перезагрузке и закрытии приложения.Я читал, что application-settings является предпочтительным механизмом хранения токенов учетных данных, однако все примеры работают со строковыми токенами, возвращенными из API.

API-интерфейс аутентификации, который я разрабатываю, предоставляет файл cookie с идентификатором сеанса, поскольку он также используется для нашего веб-интерфейса.

Я могу сказать, что этот файл cookie временно сохраняется, так как я могучтобы выполнить авторизованные запросы к API после входа в систему, однако не знаю, где хранится этот контент и как сделать его постоянным, выполняемый вызов упрощается до следующего:

    import { HttpClient } from "@angular/common/http";

    private http: HttpClient

    login(url, data) {
        this.http.post(url, data, {withCredentials: true})
            .then((result) => console.log(JSON.stringify(result)))
    }

Я вижу, чтоpost(...) может быть слишком высокого уровня, чтобы получить информацию о сеансе / куки.Я ожидаю, что размещение полученного cookie-файла в систему хранения и его перезагрузка в конструкторе службы ранней загрузки должно позволить мне выйти из приложения и запустить его снова.

Первый вопрос: не ошибаюсь ли я??Имеет ли смысл использовать этот стиль аутентификации в приложении nativescript?Из комментария @manoj я вижу, что некоторые из этих процессов могут не поддерживаться, но я не уверен, способствовала ли моя первоначальная формулировка вопросов их ответу.

Второй вопрос, есть ли еще один звонок, который мне следует ответить?что делает?Где находится текущий магазин печенья?Могу ли я установить текущее место хранения как постоянное и удалить при выходе из системы?

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

[править]

Мне показалось, что я нашел способ хотя бы проверить информацию о сеансе в своем приложении.Я видел, что я должен иметь возможность добавлять информацию о сеансе ко всем запросам, используя `Interceptor.

@Injectable()
export class LogInterceptorService implements HttpInterceptor {
private logger: Logger;
constructor(loggerService: LoggerService) {
        this.logger = loggerService.getLogger(this.constructor.name);
    }

    intercept(
        req: HttpRequest<any>,
        next: HttpHandler
    ): Observable<HttpEvent<any>> {
        this.logger.debug("ABC -> XYZ");
        if (this.logger.isDebugEnabled()) {
            this.logger.debug(JSON.stringify(req));
        }
        return next.handle(req).pipe(
            tap(
                response => {
                    this.logger.debug("XYZ -> ABC");
                    this.logger.debug(
                        `Oh boy we got an answer :: ${JSON.stringify(response)}`
                    );
                },
                error => {
                    this.logger.debug("XYZ -> ABC");
                    this.logger.debug("Something might be burning back there");
                }
            )
        );
    }
}

К сожалению, ответы на самом деле не содержат информацию о сеансе.Почему я могу делать аутентифицированные запросы?

1 Ответ

0 голосов
/ 01 мая 2019

Решение этой проблемы состояло в том, чтобы имитировать заголовки файлов cookie, когда они передавались через вызовы nativescript.Это делается с использованием шаблона HttpInterceptor.С моей стороны была некоторая путаница, так как значения в заголовке загружаются «ленивым» способом.Использование Angular термина «ленивый» не соответствует моему пониманию этого термина, но эффективно проявляется, поскольку вы должны использовать .get('target') в заголовках, а не ['target']

. Реализация моего решения приведена вthis gist

Это передает гораздо больше информации, чем требуется для успешного вызова, так как копирует все куки.Единственными необходимыми файлами cookie для сохраненного сеанса являются rememberMe и JSESSIONID, по крайней мере, для нашего shiro бэкэнда.

...