Evernote iOS SDK - Как пройти аутентификацию с помощью токена?
Я использую Evernote SDK для iOS и сохраняю маркер аутентификации, когда пользователь авторизовал доступ.
После того, как пользователь установит мое приложение на другое устройство, я хочу использовать этот токен для автоматической повторной аутентификации, но, похоже, SDK этого не поддерживает. Есть способ сделать это?
1 ответ
У меня была та же проблема на прошлой неделе, и их SDK действительно не поддерживает ее "из коробки", но после некоторых исследований я нашел решение, которое работает отлично. Это решение имитирует действительный поток аутентификации.
Немного предыстории:
Когда ENSession
Класс инициализирует, он получает учетные данные, которые сохранены в цепочке для ключей (если [[ENSession sharedSession] unauthenticate]
звонил ранее). Проблема в том, что цепочка для ключей пуста при использовании другого устройства, поэтому наша цель - добавить действительный ENCredentials
экземпляр к ENCredentialStore
,
Решение:
Добавьте следующий код в ваш код:
ENCredentials.h
а такжеENCredentialStore.h
, Они понадобятся нам позже.Инициализировать
ENSession
как вы уже делаете, используяsetSharedSessionConsumerKey:(NSString *)key consumerSecret:(NSString *)secret optionalHost:(NSString *)host
,Для того, чтобы создать действительный
ENCredentials
объект, нам нужно предоставить следующие объекты:NSString *
хозяинNSString *
edamUserIdNSString *
noteStoreUrlNSString *
webApiUrlPrefixNSString *
authenticationTokenNSDate *
Дата окончания срока
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. Удачи.