我读过很多关于sync adapter的教程,比如http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1上的教程,以及android开发人员网站上的samplesyncadapter示例代码。
但我不明白服务器端是如何处理身份验证和同步查询的。我是否可以使用php从mysql服务器数据库进行查询?

最佳答案

您丢失的部分不是同步适配器的一部分。这是AbstractAccountAuthenticator。这是一个类,它实际上处理用户的密码,并将其传递给服务器,它将需要以与所讨论的服务器匹配的方式编写。
怎样:
首先,这个过程是如何工作的?
用户在“设置”->“帐户和同步”页上输入用户名和密码。
(稍后…)同步进程开始。
SyncAdapter调用BlockingGetAuthToken()
AccountAuthenticator启动。
accountauthenticator使用常规的http(或者理想情况下是https)身份验证连接到服务器,并且一旦通过身份验证,就从服务器请求一个“令牌”。此令牌是一个很大的(例如,128位)随机数,只有在使用基于密码的身份验证登录时才能从服务器获取。
AccountAuthenticator缓存令牌,然后将令牌返回给SyncAdapter。
syncadapter尝试访问服务器上的内容,并在其请求中作为http头的一部分传递令牌。
服务器接受令牌而不是普通的http身份验证,并允许为请求提供服务。
以后的同步尝试将跳过此过程的大部分内容。在以下同步尝试中,当SyncAdapter调用BlockingGetAuthToken()时,AccountAuthenticator只返回缓存的令牌,不需要重新验证。
所以这个令牌的使用是有限的——过一段时间,服务器将拒绝接受它。此时,syncadapter将尝试使用令牌并获取身份验证错误。那又怎样?
SyncAdapter调用invalidateToken(令牌)并将(现在已过期的令牌)传递回AccountAuthenticator。
AccountAuthenticator在其缓存中找到令牌并将其丢弃。
在下次调用blockingGetAuthToken()时,AccountAuthenticator将与服务器通信并获取新令牌。从那里开始,同步正常进行。
为什么?
所以有几个优点。
普通的http身份验证通过internet以明文形式传输密码。如果使用令牌,则只发送一次密码,多次发送令牌。这在一定程度上减少了对嗅探密码的暴露。
https身份验证避免了纯文本问题,但对于移动连接来说,代价可能很高。令牌的使用允许对实际携带数据的服务器调用使用更轻量级的http连接,只有在获得令牌时,才在第一个请求上看到https开销。
分离——会计验证器知道用户的实际密码。SyncAdapter只访问令牌,从不学习密码。谷歌说,这一点很重要,因为它允许第三方应用程序使用gmail帐户和密码进行身份验证,而第三方应用程序(可能是恶意的)无法获取密码(并将其转发给一个狡猾的naer)。
到期:
代币有点危险。任何有权访问令牌的人都可以以您的身份登录。好的做法是:
服务器应在一段固定时间后使用户的令牌过期。更多的偏执--更短的超时。
每当用户更改密码时,服务器应使用户的所有令牌过期。
如果用户位于
一个Web界面注销。令牌并没有真正的“注销”概念。
服务器应考虑将令牌绑定到首先请求令牌的IP地址,然后拒绝对令牌进行身份验证(但不一定过期),前提是其他IP地址随后尝试使用该令牌。如果这样做,服务器肯定需要能够为每个用户创建多个令牌(每个用户一个令牌:ipaddress组合)--假设一个用户有两个移动设备--否则,每次一个同步时,它都会使另一个令牌失效。另外,考虑两个设备都在家庭WiFi上(在路由器后面共享一个IP地址,然后一个设备离开并开始使用移动网络——这就是为什么您可能选择不过期,所以仍在家中的设备可以继续使用令牌。但是,漫游的设备将看到身份验证失败并建立自己的新令牌。当它回到家中时,服务器应该确保提供已经为该IP地址建立的相同令牌。)
根据您的偏执程度,无论如何,请考虑只接受https上的身份验证令牌。Firesheep是一个很好的例子,说明被盗的身份验证令牌可以为您带来什么。如果你有用户敏感数据,你应该只接受通过https。另外,即使没有用户敏感数据,也可以考虑编写一个协议,要求https在允许http读取的同时更改db。

10-07 19:25
查看更多