草庐IT

android - 最佳实践(最适合 Android): authenticate a user with Facebook or Google login

coder 2023-06-08 原文

我正在开发一个应用程序,其中包含用于登录的 Facebook 和 Google 选项,以及经典的电子邮件+密码登录。我发现自己想知道有关使用第三方 API 登录的几件事:

1。 由于一个用户可以使用他的 Facebook 帐户登录,然后决定退出并使用他的 Google 帐户登录,因此应该通过他的电子邮件地址识别该用户。因此,每当他使用不同的帐户登录时,都会在数据库中搜索电子邮件地址,如果找到,它会将这个新的登录信息附加到先前创建的帐户中。请批准这一点。

2。 如果用户使用 Facebook 登录,您可以获得 accessToken、userId、用户电子邮件等。验证用户的最佳实践是什么,它仍然是最安全的方式?我应该将他的 facebook accessToken 和电子邮件地址直接发送到服务器吗?如果 accessToken 确实存在于 Facebook 上,服务器是否应该检查 Facebook? 在服务器端生成应用程序私有(private)访问 token 的最佳和最安全的方法是什么?我听说过一些关于 MD5 哈希的信息...然后我应该在 API 调用中只使用这个新生成的访问 token 而不使用任何 facebook 凭据吗?或者我应该使用 Facebook 凭据,从而将它们保存在服务器/客户端? 我将在我的应用程序的服务器端使用 Java App-engine。

3。 如果用户删除他在 Facebook 上的帐户怎么办?应用程序如何知道这一点?如果它无论如何都知道,它应该如何处理该帐户?

  1. 我是否应该定期检查 Facebook 的访问 token 是否仍然有效?为什么以及如何以及多久一次?

我不确定我问的地方是否正确。如果我错了,请重定向我应该走的路,也许是这些最佳实践的一些链接?到目前为止,我还没有找到任何可以回答我所有问题的东西。我猜它与编码和安全相关。 感谢您提供的所有提示和技巧。

最佳答案

经过一些阅读和询问,我得出了这个结论:

1。 是的,如果您希望您的用户使用他们的 Facebook 或 Google 帐户注册,您调用 API,获取电子邮件地址(在 Android 上使用 Google 的 AccountManager 更容易),将其发送到您的服务器以保存电子邮件地址,关联用户 ID 并生成它自己的访问代码。访问代码将被发送回您的客户端应用程序以存储以供以后使用。每当用户想要进行某些操作时,服务器 API 都会使用用户的电子邮件地址和访问代码调用,您可以确定它确实是用户。从外部调用 API 并正确猜测电子邮件地址和访问代码要困难得多,因此它有点安全。

2。 由于 Facebook 登录仅用于验证用户身份,这意味着仅验证用户是否存在并拥有帐户,因此我们实际上不需要 FB accessToken。我们只需要 FB accessToken 来调用 Facebook 服务器的 API,例如,当我们想要检索用户的 friend 列表等时。在这种情况下,您可以获取 Facebook SDK 提供的 Activity session 并从那里获取 accessToken。

3。 这个案例又很简单。 如果您只使用 Facebook 登录来验证用户身份,那么您不会关心用户将来是否删除了他的帐户。第一次登录后,您保存他的电子邮件地址,可能是一张照片,不再关心他的 Facebook 个人资料。 如果您使用 Facebook 登录来获取好友列表等,则无论如何您都不会将此类数据保存在本地存储中,因此一旦用户删除他的帐户,他的好友列表也会丢失。或者,您可以保留他的好友列表,并在他每次使用您的应用程序时尝试更新它,一旦他删除了他的帐户,好友列表就会停止更新,并且再次由您的用户决定是否使用 Facebook 帐户。最后一个想法更适合游戏应用用例....只是一个想法,而不是官方公认的最佳。

关于android - 最佳实践(最适合 Android): authenticate a user with Facebook or Google login,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974389/

有关android - 最佳实践(最适合 Android): authenticate a user with Facebook or Google login的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  4. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  5. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  6. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  7. ruby - 最佳原则中的原则 - 2

    我似乎经常遇到一些设计问题,但我不知道是什么是真的很合适。一方面我经常听到我应该限制耦合和坚持单一职责,但当我这样做时,我常常发现它很困难到在需要时将信息获取到程序的一部分。为了例如,classSingerdefinitialize(name)@name=nameendattr:nameend那么Song应该是:classSongdefnew(singer)@singer=singerendend或classSongdefnew(singer_name)@singer_name=singer_nameendend后者耦合性小,按道理应该用。但如果我以后发现宋有什么需要了解更多歌手,我的

  8. ruby-on-rails - 与 ActiveMerchant 一起使用的最佳支付网关是什么? - 2

    我需要使用ActiveMerchant库在我们的一个Rails应用程序中设置支付解决方案。尽管这个问题非常主观,但人们对主要网关(BrainTree、Authorize.net等)的体验如何?它必须:处理定期付款。有能力记入个人帐户。能够取消付款。有办法存储用户的付款详细信息(例如Authotize.netsCIM)。干杯 最佳答案 ActiveMerchant很棒,但在过去一年左右的时间里,我在使用它时发现了一些问题。首先,虽然某些网关可能会得到“支持”——但并非所有功能都包含在内。查看功能矩阵以确保完全支持您选择的网关-http

  9. ruby - 将 ruby​​ 哈希转换为数组的最佳方法是什么 - 2

    我有一个像这样的ruby​​散列{"stuff_attributes"=>{"1"=>{"foo"=>"bar","baz"=>"quux"},"2"=>{"foo"=>"bar","baz"=>"quux"}}}我想把它变成一个看起来像这样的散列{"stuff_attributes"=>[{"foo"=>"bar","baz"=>"quux"},{"foo"=>"bar","baz"=>"quux"}]}我还需要保留键的数字顺序,并且键的数量是可变的。上面是super简化的,但我在底部包含了一个真实的例子。执行此操作的最佳方法是什么?附言还需要递归就递归而言,这是我们可以假设的:1)

  10. Ruby 最佳实践 : working with classes - 2

    参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin

随机推荐