我正在构建一个由两个主要部分组成的应用程序:
Web应用程序有一个存储用户数据的数据库(如帖子,事件和类似内容) Mobile应用程序使用Web应用程序的REST api来访问该数据,但为此,我需要某种身份验证(用户必须对自身进行身份验证才能访问/修改其数据)。
我知道这可以通过移动应用程序在Web api的每个请求中提供用户名和密码的方式轻松完成,并且Web应用程序在提供请求之前根据数据库验证该用户名和密码。
但是,我想使用oAuth(因此用户可以使用Google,Facebook等登录),这就是事情变得复杂的地方,我不确定这样做的最佳方法是什么。
我的第一个想法:移动应用向网络应用发送oAuth提供商(例如Facebook)凭据(用户名和密码),然后根据oAuth提供商对其进行身份验证。我很快意识到这是不行的,因为这意味着用户必须信任您的网站不要滥用给定的凭据,所以这不是它的方式。 不好
我的第二个想法:移动应用使用网络应用程序API告诉网络应用它要对oAuth提供商P进行身份验证.Web应用程序重定向到用户输入其凭据的提供商P.然后,提供者P重定向回用户登录的Web应用程序,并将有关成功登录的JSON发送到移动应用程序。如果不是用户必须手动输入其凭据的部分,这将是很好的。我实现了这个解决方案,问题是,在移动应用程序访问Web应用程序后,api JSON不会立即返回,但首先重定向完成,这会让一切都搞砸。我正在考虑在移动应用程序中使用webView,但我不知道如何在发送JSON时从webView返回。我不确定我是否应该进一步追求这个想法,或者这是错误的做法? 如果某些问题得到解决可能会很好
我的第三个想法:移动应用直接针对oAuth提供商P进行身份验证。如果成功,那么移动应用会向Web应用发送包含用户信息(例如userId或用户密码)的请求,以便自定义知道它是哪个用户。但是,这意味着Web应用程序必须信任给定用户真正经过身份验证的移动应用程序。这意味着Web应用程序需要确保从移动应用程序访问api。我可以通过在移动应用程序中硬编码特殊密码(秘密)来实现这一点,该密码随每个请求一起发送,以证明请求是由移动应用程序发送的。
这种方法的不好的一面是我必须针对(移动OS,oAuth提供商)的每个组合针对oAuth提供商实施移动应用认证。我也不确定它有多安全。你认为这是一个很好的方法,我可以改进/改变什么?我有一种感觉,我错过了一些东西。 这可能很好,但需要做很多工作
请告诉我什么是最好的想法,如果有任何方法可以改善它们,谢谢
答案 0 :(得分:2)
经过一些进一步的研究并与我的一些同事交谈后,我认为最好的选择是第二个想法。我决定使用WebView处理重定向(它存在于iPhone和Android上)。 WebView我将以这样的方式配置,当用户被重定向回返回JSON的Web应用程序上的特定URL时,它会自动退出。
我认为这是最好的主意,因为这样我只需要在移动应用程序上实现/配置WebView,而所有oAuth逻辑都在Web应用程序上完成,这意味着移动应用程序(Android,iPhone)之间的代码重复次数更少,而且更多可扩展(我必须修改一个Web应用程序,而不是2或3个移动应用程序)。