Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 同步适配器和后端API;AccountManager/AccountAuthenticator应如何处理多种登录类型? TL;博士_Android_Accountmanager - Fatal编程技术网

Android 同步适配器和后端API;AccountManager/AccountAuthenticator应如何处理多种登录类型? TL;博士

Android 同步适配器和后端API;AccountManager/AccountAuthenticator应如何处理多种登录类型? TL;博士,android,accountmanager,Android,Accountmanager,Android应用程序在我的后端服务器上提供登录,可以选择自定义帐户(用户创建用户名和密码)或社交登录(使用谷歌即时登录) 在mySyncAdapter使用的AccountManager、Account和AccountAuthenticator中,处理多种身份验证类型的正确标准方法是什么 较长版本 我想要达到的目标 我有一个用于Android应用程序的REST后端服务器(Node.js/Loopback) 此后端将允许我的应用程序的用户CRUD数据库对象 当然,在服务器上需要一种形式的帐户创建和

Android应用程序在我的后端服务器上提供登录,可以选择自定义帐户(用户创建用户名和密码)或社交登录(使用谷歌即时登录)

在my
SyncAdapter
使用的
AccountManager
Account
AccountAuthenticator
中,处理多种身份验证类型的正确标准方法是什么

较长版本 我想要达到的目标 我有一个用于Android应用程序的REST后端服务器(Node.js/Loopback)

此后端将允许我的应用程序的用户CRUD数据库对象

当然,在服务器上需要一种形式的帐户创建和登录。我希望支持“自定义”帐户创建(用户指定用户名和密码)和谷歌社交登录(用户使用选定的谷歌帐户登录)

到目前为止我所拥有的 我已经建立了我的后端服务器

此后端服务器成功地支持自定义帐户创建和登录(通过此服务器发回其创建的身份验证令牌)以及使用Google auth 2.0代码的身份验证

我熟悉使用GoogleAPI控制台创建Auth2.0凭据

我已经熟悉了新的谷歌登录API。我已成功使用登录示例应用程序(该应用程序演示了新的
Auth.GoogleSignInApi
GoogleSignInOptions
等)来检索与我的Google帐户关联的身份验证代码。然后,我可以成功地使用该身份验证代码在后端进行身份验证

我已经实现了整个工作“框架”
SyncAdapter
、相关服务、存根验证器、虚拟
帐户

问题 我觉得我了解各个较低级别的细节,我已经让它们发挥作用,但我正在努力解决如何将这些细节结合起来,并涉及
账户
s和
账户管理器

最佳实践是什么,块级体系结构我应该(a)使用
SyncAdapter
中的
Auth.GoogleSignInApi
,以及(b)支持备用自定义帐户

我认为应该怎么做 如果我的应用程序只使用谷歌登录我的后端,那么我认为情况应该是这样的:

  • 我创建了一个
    AccountAuthenticator
    ,其中使用了
    Auth.GoogleSignInApi
    (新的登录API)。具体来说,
    .getAuthToken()
    将查看
    AccountManager
    是否已经有了Google OAuth 2.0代码。如果没有,它将使用
    Auth.GoogleSignInApi.getsigninent(…)
    从谷歌获得一个Auth代码。一旦我有了身份验证代码,我就可以使用它在我的服务器上进行身份验证(已经过验证和测试)

  • 我已经有一个自定义的
    帐户
    对象。这将出现在设置->帐户和同步(例如“MyApp”)下,点击它可提供启用或禁用同步的设置。这将保持现状。即使我使用Google登录,我仍然需要有这个自定义的
    帐户
    对象

到目前为止,这听起来像是正确的方法吗

现在,如果我的应用程序同时提供谷歌和自定义帐户创建/登录,那么我可以看到这一工作方式可能是:

  • 在初始设置期间,用户必须选择自定义帐户或使用Google登录
  • 如果他们选择自定义帐户,那么我可能会将他们的凭据(以安全的方式)保存在
    AccountManager
    中。同样重要的是,我必须以某种方式(可能在
    Account
    对象中,或者在
    SharedReferences
    中)保持这是一个自定义帐户
  • 如果他们选择Google登录,则调用
    Auth.GoogleSignInApi.getsigninent(…)
    来完成Google帐户选择和身份验证过程。当我拥有身份验证代码时,我会将其保存在
    AccountManager
    中,并以某种方式保存这样一个事实,即这是
    Google
    帐户登录,而不是自定义帐户
  • 我仍然只有一个自定义的“MyApp”
    帐户
  • 当my
    SyncAdapter
    运行时,“MyApp”
    Account
    被传入,my
    AccountAuthenticator
    尝试检索现有的身份验证代码
  • 然后,假设现有令牌检索成功,
    AccountAuthenticator
    必须确定这是自定义登录还是谷歌登录。如果是自定义登录,则我的
    SyncAdapter
    调用后端的
    user/login
    端点。如果是谷歌登录,那么我的
    SyncAdapter
    使用身份验证代码调用我后端的
    /auth/Google/callback?code=xxxxxxxxxxxxxx
    。换句话说,
    AccountAuthenticator
    知道它正在从
    AccountManager
    获取几种类型的身份验证代码之一。如果
    AccountAuthenticator
    确定它没有有效的身份验证令牌,那么它必须点击我自己的后端API获取一个,或者点击Google获取OAuth令牌,具体取决于帐户类型。然后,给定一个令牌,
    SyncAdapter
    必须知道它用于哪种帐户
我想到的另一种方法是:

  • 我的
    帐户
    对象仅在用户选择登录类型(手动创建帐户或谷歌登录)后创建并存储在
    帐户管理器
  • 帐户
    类型或名称字符串将有一个标记来指示(子)帐户类型
  • AccountAuthenticator
    将根据该标记确定帐户类型,并根据它从my API或Google获取新的令牌
  • 或者。。。也许我甚至有多个
    帐户验证器
    ;一个用于自定义帐户,一个用于Google s