我正在编写一个Windows Phone 8.1移动应用程序,该应用程序的数据源是Azure移动服务 .
从最近两天开始,我的登录功能停止了工作 . 现在它正在抛出 The request could not be completed. (Unauthorized) 错误 .
我没有对登录服务如何停止进行任何更改感到惊讶?其他服务仍在运作 .
填充错误堆栈跟踪是:
请求无法完成 . (未经授权){Microsoft.WindowsAzure.MobileServices.MobileServiceInvalidOperationException:无法完成请求 . (未经授权)在Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__18.MoveNext()---从抛出异常的上一个位置的堆栈跟踪结束---在系统的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务) System.Runtime.CompilerServices.TaskAwaiter.GetResult()中的.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于Microsoft.WindowsAzure.MobileServices.MobileServiceHttpClient.d__1d.MoveNext()---来自先前位置的堆栈跟踪结束抛出---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于Microsoft.WindowsAzure的System.Runtime.CompilerServices.TaskAwaiter1.GetResult()处 . MobileServices.MobileServiceHttpClient . <RequestAsync> d__4.MoveNext()---从抛出异常的上一个位置开始的堆栈跟踪结束---在System.Runtime.Compiler中Service.TaskAwaiter.ThrowForNonSuccess(任务任务)位于System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务),位于System.Runtime.CompilerServices.TaskAwaiter1.GetResult(),位于Microsoft.WindowsAzure.MobileServices.MobileServiceClient.d__b.MoveNext() - - 从抛出异常的先前位置开始的堆栈跟踪结束---在System.Runtime.CompilerServices上System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)处Microsoft.WindowsAzure.MobileServices.MobileServiceClient上的.TaskAwaiter1.GetResult() . <InvokeApiAsync> d__02.MoveNext()---抛出异常的前一个位置的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess System.Runtime.CompilerServices.TaskAwaiter`1.GetResu上System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)的(任务任务)在MYAPP.SignIn.d__1.MoveNext()}的lt()
我调用登录服务的代码是:
var client = new MobileServiceClient("https://<My-Azure-Service>.azure-mobile.net/", "***KEY***");
var myLogin = new LoginRequest
{
UserName = "username",
Password = "password",
DeviceToken = deviceID,
OSVersion = "WP 8",
AppVersion = "The major & minor version",
DeviceModel = "WP",
DeviceTypeID = 3
};
var loginResult = await client.InvokeApiAsync<LoginRequest, LoginResponse>("user/loguserin", myLogin, HttpMethod.Post, null);
请帮我解决这个问题 .
1 回答
未授权错误来自服务器,这可能是由于a)API的授权问题,或b)API代码中的问题 .
后者是你必须与客户合作的东西 . 由于代码正在执行登录,因此很多情况可能会导致401 Unauthorized . 这不是标准的移动服务登录功能,您的客户端可以控制执行的代码以及此时返回的错误 .
谈到API的授权问题,移动服务允许API开发人员限制访问以下四个级别之一:
Everyone(或"Anonymous") - 任何人都可以访问的完全公共API(建议用于登录 endpoints
应用程序密钥 - 仅供提供应用程序密钥的人员使用 . 应用程序密钥由服务器提供,并且是原始帖子的代码中标记为
***KEY***
的值 . 此密钥附加到对移动服务的所有请求主密钥 - 仅供提供主密钥的人使用 . 主密钥由服务器提供,并且应该 never 存储在设备代码中 .
经过身份验证的用户 - 仅适用于提供有效移动服务令牌的用户 . 此令牌通常通过让用户通过其中一个受支持的第三方身份提供商登录来获得,但在这种情况下,令牌是由客户端的代码根据他们维护的一些用户名和密码生成的 .
如果API设置为其中之一,并且来自设备的调用不符合要求,则将返回401 . 您应该咨询您的客户,以了解他们为登录API设置的授权级别 .
这个登录调用可能附加了已过期的旧令牌,这可能是_935668 . 请检查是否是这种情况 - 使用Fiddler或类似的跟踪可以帮助您跟踪此情况 . 您甚至可以使用它来比较来自Android的呼叫 . 您也可以提前使用
client.Logout()
确保没有令牌发送到登录 endpoints .