我正在构建一个由两个主要部分组成的应用程序:
- 带有 REST API 的 Web 应用程序。
- 移动应用程序(安卓、iPhone)。
Web 应用程序有一个数据库,用于存储有关用户的数据(如帖子、事件等)。
移动应用程序使用 Web 应用程序的 REST api 来访问该数据,但为此我需要某种身份验证(用户必须对自己进行身份验证才能访问/修改他的数据)。
我知道这可以通过以下方式轻松完成,即移动应用程序在对 Web api 的每个请求中提供用户名和密码,并且 Web 应用程序在服务请求之前针对数据库验证该用户名和密码。
但是,我想使用 oAuth(因此用户可以使用 Google、Facebook 等登录),这就是事情变得复杂的地方,我不确定什么是最好的方法。
我的第一个想法:移动应用程序将 oAuth 提供程序(例如 Facebook)凭据(用户名和密码)发送到 Web 应用程序,然后根据 oAuth 提供程序对它们进行身份验证。我很快意识到这是不行的,因为这意味着用户必须相信您的网站不会滥用给定的凭据,所以这不是这样做的方式。不好
我的第二个想法:移动应用程序使用 Web 应用程序 api 告诉 Web 应用程序它想要针对 oAuth 提供者 P 进行身份验证。Web 应用程序重定向到提供者 P,用户在其中输入他的凭据。然后,提供商 P 重定向回用户登录的 Web 应用程序,并将有关成功登录的 JSON 发送到移动应用程序。如果不是用户必须手动输入他的凭据的部分,这将是很棒的。我实现了这个解决方案,问题是,在移动应用程序访问 Web 应用程序 api JSON 后没有立即返回,但首先重定向完成,这一切都搞砸了。我正在考虑在移动应用程序中使用 webView,但是当要发送 JSON 时,我不知道如何从 webView 返回。我不确定我是否应该进一步追求这个想法或者这是错误的做法?如果解决了一些问题可能会很好
我的第三个想法:移动应用程序直接针对 oAuth 提供者 P 进行身份验证。如果成功,则移动应用程序向包含用户信息(例如用户 ID 或用户密码)的网络应用程序发送请求,以便网络应用程序知道它是哪个用户。然而,这意味着网络应用程序必须信任给定用户真正经过身份验证的移动应用程序。这意味着 Web 应用程序需要确保从移动应用程序访问 api。我可以通过在移动应用程序中硬编码一个特殊密码(秘密)来做到这一点,该密码随每个请求一起发送,以证明该请求是由移动应用程序发送的。
这种方法的不好的一面是,我必须针对(移动操作系统、oAuth 提供者)的每种组合针对 oAuth 提供者实现移动应用程序身份验证。我也不确定它有多安全。你认为这是一个好方法吗,我可以改进/改变什么?我有一种感觉,我错过了一些东西。这可能很好,但需要做很多工作
请告诉我什么想法最好,如果有任何改进方法,谢谢