iOS 客户端的 Azure Active Directory 刷新令牌
Azure Active Directory Refresh Token for iOS client
我从 QuickStart 下载了一个标准的 iOS 应用程序,如下所示:
它是一个非常基本的 iOS 应用程序,可与 Azure 后端通信,您可以在其中推送和拉取数据。
登录、注销
如果您要在门户中启用身份验证,则需要登录。您可以这样做:
[client loginWithProvider:@"windowsazureactivedirectory"
controller:controller
animated:YES
completion:^(MSUser *user, NSError *error) {
// save data into your keychain
// invoke various custom APIs
// be able to pull and push data to your Easy Table
}];
注销也很简单:
[client logoutWithCompletion:^(NSError * _Nullable error) {
if(!error) {
[self clearCredentials];
complete(nil);
} else {
DDLogError(@"%@", [error debugDescription]);
complete(error);
}
}];
正在刷新令牌
我的问题是令牌。我知道在使用 Active Directory 时,他们给你的令牌只能持续 1 小时。如果您要获得刷新令牌,则需要在 14 天内使用它。如果您确实在 14 天内使用它,则在之后的 90 天内都没有问题。
因此,我等了一个小时,当我尝试使用客户端提取数据或调用 API 时,它会给我一个 401 错误:
Error Domain=com.Microsoft.MicrosoftAzureMobile.ErrorDomain Code=-1301 "The server returned an error." UserInfo={com.Microsoft.MicrosoftAzureMobile.ErrorResponseKey= { URL: https://xxxx-xxxxxx.azurewebsites.net/api/getUserProfileData } { status code: 401, headers {
"Content-Length" = 0;
Date = "Tue, 25 Oct 2016 09:18:57 GMT";
Server = "Microsoft-IIS/8.0";
"Set-Cookie" = "ARRAffinity=743d3a9e04f3c081f27c2f2c3af95d099f93dc60f14553bd4423b0abc62cfd33;Path=/;Domain=xxxx-xxxxxx.azurewebsites.net";
"Www-Authenticate" = "Bearer realm=\"xxxx-xxxxxx.azurewebsites.net\"";
"X-Powered-By" = "ASP.NET";
} }, NSLocalizedDescription=The server returned an error., com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey= { URL: https://xxxx-xxxxxx.azurewebsites.net/api/getUserProfileData }}
客户端访问我的自定义节点脚本的日志给出了 401.71 未授权错误:
2016-10-25T09:18:55 PID[35372] Warning JWT validation failed: IDX10223: Lifetime validation failed. The token is expired.
ValidTo: '10/25/2016 09:12:31'
Current time: '10/25/2016 09:18:55'..
2016-10-25T09:18:55 PID[35372] Information Sending response: 401.71 Unauthorized
如果我要下拉 table 来获取数据:
com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey= { URL: https://xxx-xxxxx.azurewebsites.net/tables/TodoItem?$skip=0&$filter=(updatedAt%20ge%20datetimeoffset'2016-10-20T02%3A33%3A25.607Z')&$orderby=updatedAt%20asc&__includeDeleted=true&$top=50 }}
code - -1301
domain - com.Microsoft.MicrosoftAzureMobile.ErrorDomain
userInfo - {
NSLocalizedDescription = "The server returned an error.";
"com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey" = " { URL: https://xxxx-xxxxxx.azurewebsites.net/tables/TodoItem?$skip=0&$filter=(updatedAt%20ge%20datetimeoffset'2016-10-20T02%3A33%3A25.607Z')&$orderby=updatedAt%20asc&__includeDeleted=true&$top=50 }";
Microsoft Azure 在此处有一篇关于刷新令牌的小文章:
https://azure.microsoft.com/en-us/blog/mobile-apps-easy-authentication-refresh-token-support/
我会使用 refreshUserWithCompletion: 方法,但它一直给我 403 错误。
因此,如果有人在 iOS 应用程序上成功刷新了他们的令牌,请发表评论。
谢谢!
更新:刷新工作,令牌仍将在 1 小时后过期
点击链接后,我的 refreshUserWithCompletion 方法有效,并且 returns 一个带有令牌的有效 MSUser 对象。 但是,问题是这个令牌仍然只能使用 1 小时。我在下面粘贴我的刷新令牌代码。请推荐,谢谢!
if(!client.currentUser) {
[client loginWithProvider:@"windowsazureactivedirectory"
controller:controller
animated:YES
completion:^(MSUser * user, NSError *error) {
DDLogInfo(@"INITIAL TOKEN, userId: %@, token: %@", user.userId, user.mobileServiceAuthenticationToken);
if(!error && user) {
[client refreshUserWithCompletion:^(MSUser * _Nullable user, NSError * _Nullable error) {
// user object now has new token for us to use.
// I'm assuming this is the refresh token.
[self saveUserIntoKeyChain: user];
// I can just load the userId and token from the keychain for future uses, and they all work.
// The only problem is that this token is only good for 1 hour.
}];
}
}];
}
AAD 需要刷新配置。请参阅我关于该主题的博客:https://shellmonger.com/2016/04/13/30-days-of-zumo-v2-azure-mobile-apps-day-7-refresh-tokens/
如果您没有配置刷新,则它不可用。配置刷新后,下次登录时,您将获得一个可以重复使用的刷新令牌。
我从 QuickStart 下载了一个标准的 iOS 应用程序,如下所示:
它是一个非常基本的 iOS 应用程序,可与 Azure 后端通信,您可以在其中推送和拉取数据。
登录、注销
如果您要在门户中启用身份验证,则需要登录。您可以这样做:
[client loginWithProvider:@"windowsazureactivedirectory"
controller:controller
animated:YES
completion:^(MSUser *user, NSError *error) {
// save data into your keychain
// invoke various custom APIs
// be able to pull and push data to your Easy Table
}];
注销也很简单:
[client logoutWithCompletion:^(NSError * _Nullable error) {
if(!error) {
[self clearCredentials];
complete(nil);
} else {
DDLogError(@"%@", [error debugDescription]);
complete(error);
}
}];
正在刷新令牌
我的问题是令牌。我知道在使用 Active Directory 时,他们给你的令牌只能持续 1 小时。如果您要获得刷新令牌,则需要在 14 天内使用它。如果您确实在 14 天内使用它,则在之后的 90 天内都没有问题。
因此,我等了一个小时,当我尝试使用客户端提取数据或调用 API 时,它会给我一个 401 错误:
Error Domain=com.Microsoft.MicrosoftAzureMobile.ErrorDomain Code=-1301 "The server returned an error." UserInfo={com.Microsoft.MicrosoftAzureMobile.ErrorResponseKey= { URL: https://xxxx-xxxxxx.azurewebsites.net/api/getUserProfileData } { status code: 401, headers { "Content-Length" = 0; Date = "Tue, 25 Oct 2016 09:18:57 GMT"; Server = "Microsoft-IIS/8.0"; "Set-Cookie" = "ARRAffinity=743d3a9e04f3c081f27c2f2c3af95d099f93dc60f14553bd4423b0abc62cfd33;Path=/;Domain=xxxx-xxxxxx.azurewebsites.net"; "Www-Authenticate" = "Bearer realm=\"xxxx-xxxxxx.azurewebsites.net\""; "X-Powered-By" = "ASP.NET"; } }, NSLocalizedDescription=The server returned an error., com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey= { URL: https://xxxx-xxxxxx.azurewebsites.net/api/getUserProfileData }}
客户端访问我的自定义节点脚本的日志给出了 401.71 未授权错误:
2016-10-25T09:18:55 PID[35372] Warning JWT validation failed: IDX10223: Lifetime validation failed. The token is expired. ValidTo: '10/25/2016 09:12:31' Current time: '10/25/2016 09:18:55'.. 2016-10-25T09:18:55 PID[35372] Information Sending response: 401.71 Unauthorized
如果我要下拉 table 来获取数据:
com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey= { URL: https://xxx-xxxxx.azurewebsites.net/tables/TodoItem?$skip=0&$filter=(updatedAt%20ge%20datetimeoffset'2016-10-20T02%3A33%3A25.607Z')&$orderby=updatedAt%20asc&__includeDeleted=true&$top=50 }} code - -1301 domain - com.Microsoft.MicrosoftAzureMobile.ErrorDomain userInfo - { NSLocalizedDescription = "The server returned an error."; "com.Microsoft.MicrosoftAzureMobile.ErrorRequestKey" = " { URL: https://xxxx-xxxxxx.azurewebsites.net/tables/TodoItem?$skip=0&$filter=(updatedAt%20ge%20datetimeoffset'2016-10-20T02%3A33%3A25.607Z')&$orderby=updatedAt%20asc&__includeDeleted=true&$top=50 }";
Microsoft Azure 在此处有一篇关于刷新令牌的小文章: https://azure.microsoft.com/en-us/blog/mobile-apps-easy-authentication-refresh-token-support/
我会使用 refreshUserWithCompletion: 方法,但它一直给我 403 错误。
因此,如果有人在 iOS 应用程序上成功刷新了他们的令牌,请发表评论。
谢谢!
更新:刷新工作,令牌仍将在 1 小时后过期
点击链接后,我的 refreshUserWithCompletion 方法有效,并且 returns 一个带有令牌的有效 MSUser 对象。 但是,问题是这个令牌仍然只能使用 1 小时。我在下面粘贴我的刷新令牌代码。请推荐,谢谢!
if(!client.currentUser) {
[client loginWithProvider:@"windowsazureactivedirectory"
controller:controller
animated:YES
completion:^(MSUser * user, NSError *error) {
DDLogInfo(@"INITIAL TOKEN, userId: %@, token: %@", user.userId, user.mobileServiceAuthenticationToken);
if(!error && user) {
[client refreshUserWithCompletion:^(MSUser * _Nullable user, NSError * _Nullable error) {
// user object now has new token for us to use.
// I'm assuming this is the refresh token.
[self saveUserIntoKeyChain: user];
// I can just load the userId and token from the keychain for future uses, and they all work.
// The only problem is that this token is only good for 1 hour.
}];
}
}];
}
AAD 需要刷新配置。请参阅我关于该主题的博客:https://shellmonger.com/2016/04/13/30-days-of-zumo-v2-azure-mobile-apps-day-7-refresh-tokens/
如果您没有配置刷新,则它不可用。配置刷新后,下次登录时,您将获得一个可以重复使用的刷新令牌。