Evernote iOS SDK - 如何使用令牌进行身份验证?
Evernote iOS SDK - How do I authenticate with a token?
我正在为 iOS 使用 Evernote SDK,并且在用户授权访问时保存身份验证令牌。
一旦用户在不同的设备上安装了我的应用程序,我想使用该令牌自动重新进行身份验证,但 SDK 似乎不支持。有办法吗?
上周我遇到了同样的问题,他们的 SDK 确实不支持开箱即用,但经过一番研究,我找到了一个完美的解决方案。此解决方案模仿有效的身份验证流程。
一点背景知识:
当 ENSession
class 初始化时,它会检索保存在钥匙串上的凭据(除非之前调用了 [[ENSession sharedSession] unauthenticate]
)。问题是当使用不同的设备时钥匙串是空的,所以我们的目标是添加一个有效的 ENCredentials
实例到 ENCredentialStore
.
解法:
将以下导入添加到您的代码中:ENCredentials.h
和 ENCredentialStore.h
。我们稍后会需要它们。
像你已经做的那样初始化ENSession
,使用setSharedSessionConsumerKey:(NSString *)key consumerSecret:(NSString *)secret optionalHost:(NSString *)host
。
为了创建有效的ENCredentials
对象,我们需要提供以下对象:
NSString *
主机
NSString *
edamUserId
NSString *
noteStoreUrl
NSString *
webApiUrlPrefix
NSString *
authenticationToken
NSDate *
到期日期
host
始终是 www.evernote.com
(如 ENSessionBootstrapServerBaseURLStringUS
下的 ENSession
中所定义)。
edamUserId
是你拿到原始token时收到的user id。 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
([=39= 的值],请参阅 this):
@"S=s161:U=5ce3f20:E=1561182201b:C=24eb9d000f8:P=285:A=app:V=2:H=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。祝你好运。
我正在为 iOS 使用 Evernote SDK,并且在用户授权访问时保存身份验证令牌。
一旦用户在不同的设备上安装了我的应用程序,我想使用该令牌自动重新进行身份验证,但 SDK 似乎不支持。有办法吗?
上周我遇到了同样的问题,他们的 SDK 确实不支持开箱即用,但经过一番研究,我找到了一个完美的解决方案。此解决方案模仿有效的身份验证流程。
一点背景知识:
当 ENSession
class 初始化时,它会检索保存在钥匙串上的凭据(除非之前调用了 [[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
(如ENSessionBootstrapServerBaseURLStringUS
下的ENSession
中所定义)。edamUserId
是你拿到原始token时收到的user id。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
([=39= 的值],请参阅 this):@"S=s161:U=5ce3f20:E=1561182201b:C=24eb9d000f8:P=285:A=app:V=2:H=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。祝你好运。