如何通过 oauth 向第三方授权移动应用程序但连接到我的服务,而不是第三方

Posted

技术标签:

【中文标题】如何通过 oauth 向第三方授权移动应用程序但连接到我的服务,而不是第三方【英文标题】:How to authorize mobile apps with a third party by oauth BUT connect to my service, not the 3rd party 【发布时间】:2011-12-21 05:17:20 【问题描述】:

我的应用程序的架构如下:我有一个网络服务(在 GAE 上运行,与这个问题不太相关),并且该服务包含的数据可通过网站以及移动和桌面应用程序提供。

目前,用户通过 Google ClientLogin 对网站进行身份验证,应用程序通过 GAE 的内置 oauth 提供程序进行身份验证/获得授权。 (OAuth 在这里主要用于身份验证,我的应用程序实际上并没有通过 OAuth 使用任何外部数据,除了用户的唯一 ID 和电子邮件地址。)

我想做的是扩大用户可以用来登录的服务数量。由于应用程序的复杂因素,我似乎需要 OAuth。但我无法真正正确地概念化这个流程应该如何进行。

让我们以 Facebook 为例。当移动应用程序通过 Facebook oauth 流程并获取访问令牌时,这还不够 - 因为它是我的服务,而不是应用程序,它实际上需要与 facebook 交谈以检索联系信息和唯一的用户 ID。这让我认为 OAuth 过程需要在我的服务上下文中发生,而不是在移动应用程序中发生。然后,我的服务成为消费者,Facebook 成为 oauth 提供者,并且服务持有 oauth 访问令牌,当用户第一次设置他们的帐户时会发生这种情况。

如果这是正确的方法,那么应用程序的身份验证会在哪里?当用户已经拥有一个帐户并安装了一个新的移动应用程序实例时会发生什么?我想象还要通过 oauth 过程,将凭据与我的服务已存储的数据进行匹配,然后从服务向应用程序发出我自己的“访问令牌”,以授权该应用程序的实例。这似乎令人费解和骇人听闻。

我敢肯定,我不能成为唯一一个实际上“借用”第三方帐户系统以用于具有后端的移动应用程序的人,但我真的不知道该怎么做这是。

我没有看到什么和/或在概念上出现错误?

【问题讨论】:

蟋蟀 我觉得我可能错误地提出了这个问题。如果是这样,请告诉我。否则,我会在这里回答我自己的问题......最终。 【参考方案1】:

我和几个同事曾经在大学里做过一个性质非常相似的项目。我们通过 Facebook 或 Foursquare 使用各自的 OAuth API 对用户进行身份验证。

该应用的原生 android 版本在 OAuth 提供程序的起始页上打开了一个 WebView,该页面在身份验证后重定向回我们的服务。然后我们的服务向 OAuth 提供者请求了 OAuth 令牌(Foursquare 有一些 pretty simple instructions)。当我们得到那个令牌时,我们使用 cookie 建立了一个会话,我们可以从应用程序访问它。

为了验证会话,我们只是检查了访问令牌对于提供者是否仍然有效。我们还使用各个提供商的唯一用户 ID 来区分用户。

所以是的,对我们有用的是:让应用验证和授权您的服务,而不是应用本身。

【讨论】:

那么,您的应用程序正在存储这些 cookie 并使用它们对服务进行身份验证,您会将 cookie 与服务上的适当 oauth 令牌匹配吗?这与仅仅生成一个 guid 并将其交给应用程序有什么不同吗? 确切地说,应用程序正在使用那些存储的 cookie(包含加密的 ID 等)对服务进行身份验证,然后服务将与 OAuth 提供者对话(以检查令牌是否仍然有效)。您也可以使用某种 GUID,但您需要使模拟该应用程序变得困难,例如有一些只有服务器知道验证的东西。 谢天谢地,就我而言,该应用并未处理特别敏感的数据。但是,这种方法还是有道理的,但似乎有点过于“自己动手”了。它是一个解决方案,但我想知道这是否是解决这个问题的共识方法。

以上是关于如何通过 oauth 向第三方授权移动应用程序但连接到我的服务,而不是第三方的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2.0 的四种授权模式

node_oAuth授权

OAuth2.0的四种授权模式,你会了吗?

Oauth2

OAuth2介绍与使用

Oauth2详解-介绍(一)