您缺少的部分不是同步适配器的一部分。是AbstractAccountAuthenticator。它是实际处理用户密码并将其传递给服务器的类,它需要以与所讨论的服务器很好地配对的方式编写。
方式:
首先,这个过程是如何工作的?
在设置->帐户和同步page.
- 用户输入用户名和密码同步进程starts.
- SyncAdapter调用blockingGetAuthToken()
- AccountAuthenticator starts.
- AccountAuthenticator使用常规的http (理想情况下是https)身份验证来连接到服务器,并且一旦通过身份验证,就会从服务器请求一个“令牌”。这个令牌是一个大的(比如说,128位)随机数,应该只能从服务器获得,如果你已经使用基于密码的authentication.
- AccountAutenticator登录缓存令牌,然后将令牌返回到SyncAdapter.
- SyncAdapter尝试访问服务器上的内容,并在其requests.
- Server中传递令牌作为http报头的一部分接受令牌而不是普通的http-auth,并允许请求被served.
- Future同步尝试将跳过此过程的大部分。在随后的同步尝试中,当SyncAdapter调用blockingGetAuthToken()时,无需re-authenticate.
,AccountAuthenticator只返回缓存的令牌
所以这个令牌的用途是有限的--一段时间后,服务器将拒绝接受它。此时,SyncAdapter尝试使用令牌并得到身份验证错误。然后呢?
SyncAdapter调用invalidateToken(令牌)并将(现已过期的令牌)传递回AccountAuthenticator.
- AccountAuthenticator,然后在其缓存中查找令牌并将其丢弃。
- 在下一次调用blockingGetAuthToken()时,AccountAuthenticator将与服务器通信并获得新的令牌。从那里开始,同步正常进行。
为什么?
所以有几个优点。
- 普通http身份验证在因特网上以明文传输密码。如果使用令牌,则只发送一次密码,多次发送令牌。这在一定程度上减少了密码对sniffing.
- https身份验证的暴露避免了明文问题,但在移动连接方面可能很昂贵。令牌的使用允许实际携带数据的服务器调用的轻量级http连接,当令牌为obtained.
- Segregation时,https开销仅在第一个请求中可见-- AccountAuthenticator知道用户的实际密码。SyncAdapter只能访问令牌,而不会获知密码。这对谷歌来说很重要,因为它允许第三方应用程序使用gmail账户和密码进行身份验证,而不需要第三方应用程序(可能是恶意的)来获取密码(并将其转发到不正当的naer-do-well)
过期时间:
代币是有点危险的。有权访问令牌的任何人都可以以您的身份登录。所以,这里有一些好的做法:
- 服务器应在固定时间段后使用户的令牌过期。更偏执的是--每当用户更改时,较短的timeouts.
- The服务器应该使用户的所有令牌过期如果用户在web界面上注销,password.
- The服务器可能不会使分配给web设备的令牌过期。令牌没有真正的“注销”概念。
- 服务器应该考虑将令牌绑定到第一个请求令牌的IP地址,然后如果另一个IP地址随后尝试使用该令牌,则拒绝对令牌进行身份验证(但不一定过期)。如果这样做,服务器肯定需要能够为每个用户创建多个令牌(每个用户一个令牌: it地址组合) --假设一个用户有两个移动设备--否则,每次一个同步时,都会使另一个的令牌失效。还要考虑两个都在家庭wifi上的设备(共享路由器后面的一个ip地址,然后一个设备离开并开始使用移动网络--这就是为什么您可能选择不过期,这样仍然在家里的设备可以继续使用令牌。但是,漫游的设备将看到身份验证失败,并建立自己的新令牌。当它回到家时,服务器应该确保提供与在你的偏执水平上已经为该IP address.)
- Depending建立的令牌相同的令牌,无论如何都要考虑只接受https上的身份验证令牌。Firesheep就是一个很好的例子,说明了偷来的身份验证令牌能给你带来什么。如果你有用户敏感的数据,你应该只接受通过https。此外,即使你没有用户敏感的数据,你也可以考虑编写一个协议,要求https在允许http读取的同时更改数据库。