Evernote iOS SDK - Как пройти аутентификацию с помощью токена?

Я использую Evernote SDK для iOS и сохраняю маркер аутентификации, когда пользователь авторизовал доступ.

После того, как пользователь установит мое приложение на другое устройство, я хочу использовать этот токен для автоматической повторной аутентификации, но, похоже, SDK этого не поддерживает. Есть способ сделать это?

1 ответ

Решение

У меня была та же проблема на прошлой неделе, и их SDK действительно не поддерживает ее "из коробки", но после некоторых исследований я нашел решение, которое работает отлично. Это решение имитирует действительный поток аутентификации.

Немного предыстории:

Когда ENSession Класс инициализирует, он получает учетные данные, которые сохранены в цепочке для ключей (если [[ENSession sharedSession] unauthenticate] звонил ранее). Проблема в том, что цепочка для ключей пуста при использовании другого устройства, поэтому наша цель - добавить действительный ENCredentials экземпляр к ENCredentialStore,

Решение:

  1. Добавьте следующий код в ваш код: ENCredentials.h а также ENCredentialStore.h, Они понадобятся нам позже.

  2. Инициализировать ENSession как вы уже делаете, используя setSharedSessionConsumerKey:(NSString *)key consumerSecret:(NSString *)secret optionalHost:(NSString *)host,

  3. Для того, чтобы создать действительный ENCredentials объект, нам нужно предоставить следующие объекты:

    • NSString * хозяин
    • NSString * edamUserId
    • NSString * noteStoreUrl
    • NSString * webApiUrlPrefix
    • NSString * authenticationToken
    • NSDate * Дата окончания срока

    host всегда www.evernote.com (как определено в ENSession под ENSessionBootstrapServerBaseURLStringUS).

    edamUserId идентификатор пользователя, который вы получили, когда получили оригинальный токен. То же самое для expirationDate, Если вы не знаете, как их получить, вам следует использовать [[ENSession sharedSession].userStore getUserWithSuccess:^(EDAMUser *user) после проверки подлинности.

    Таким образом, единственные объекты, которые на самом деле отсутствуют noteStoreUrl а также webApiUrlPrefix, Их формат всегда:

    • noteStoreUrl: https://www.evernote.com/shard/edam_shard/notestore
    • webApiUrlPrefix: https://www.evernote.com/shard/edam_shard/

    К счастью, ваш токен уже содержит edam_shared (ценность S=вот это)

    @"S= S161:U=5ce3f20: Е =1561182201b: С =24eb9d000f8: Р =285: А = приложение:V=2: Н =e8ebf56eac26aaacdef2f3caed0bc309"

    Если вы извлекаете s161 и поместите его в URL-адреса выше, он будет работать (я уверен, что вы знаете, как извлечь это, но дайте мне знать, если у вас возникли проблемы).

Теперь мы готовы к аутентификации с использованием токена. Сначала представьте необходимые функции из ENSession, используя категорию:

@interface ENSession(Authentication)

- (void)startup;

- (void)addCredentials:(ENCredentials *)credentials;

@end

И аутентифицируйтесь с помощью токена:

ENCredentials *credentials = [[ENCredentials alloc] initWithHost:ENSessionBootstrapServerBaseURLStringUS edamUserId:userId noteStoreUrl:noteStoreUrl webApiUrlPrefix:webApiUrlPrefix authenticationToken:token expirationDate:expirationDate];
[[ENSession sharedSession] addCredentials:credentials];
[[ENSession sharedSession] startup];

Последняя строка важна для обновления ENSession и получить новые сохраненные учетные данные.

Теперь вы прошли проверку подлинности и готовы запросить SDK. Удачи.

Другие вопросы по тегам