关于使用OAuth使用自己的API的问题

关于使用OAuth使用自己的API的问题,api,authentication,rest,oauth,restful-architecture,Api,Authentication,Rest,Oauth,Restful Architecture,我正在为我正在从事的项目构建RESTful API,我想让主应用程序使用该API,因为: 这将导致需要维护一组代码 如果我们决定为第三方开发者公开API,那么我们已经完成了 它打开了制造使用它的移动应用程序的可能性 我真的很想学怎么做 API将托管在子域https://api.example.com主web应用程序将托管在根域https://example.com 从概念上讲,我理解一切是如何工作的,但我的主要问题是,如果发生任何情况,身份验证流将如何改变。通常第三方应用程序会: 从https:

我正在为我正在从事的项目构建RESTful API,我想让主应用程序使用该API,因为:

  • 这将导致需要维护一组代码
  • 如果我们决定为第三方开发者公开API,那么我们已经完成了
  • 它打开了制造使用它的移动应用程序的可能性
  • 我真的很想学怎么做
  • API将托管在子域
    https://api.example.com
    主web应用程序将托管在根域
    https://example.com

    从概念上讲,我理解一切是如何工作的,但我的主要问题是,如果发生任何情况,身份验证流将如何改变。通常第三方应用程序会:

  • https://api.example.com/request_token
  • 重定向用户以在
    https://api.authenticate.com/authorize
  • 将重定向回第三方应用程序
  • https://api.example.com/access_token
  • 由于我控制这两个域,我可以执行类似的操作:

  • 当用户登录到
    https://www.example.com
  • 用户使用
    https://www.example.com
    调用与
    https://api.example.com/authorize
  • 如果凭据有效,则将请求令牌交换为访问令牌
  • 访问令牌保存在会话中,并在用户正常注销时过期
  • 第3步感觉好像是错误的,因为会有重复的代码,但是如果登录表单是
    https://www.example.com
    已将数据发送到
    https://api.example.com
    因为它们在技术上是不同的领域


    我是不是把它复杂化了?

    我想你是把它复杂化了一点。如果代码正确分离,您可以轻松地在应用程序的服务层上构建一个精简的REST层,而应用程序的控制器也可以在服务层上构建一个精简的REST层。

    我遇到了同样的问题,并像这样解决了它

    1 对于使用my API的第三方应用程序,它们必须通过OAuth对所有请求进行身份验证

    2 对于我自己的第三方客户机(移动、AIR等),他们使用OAuth,不同的是我允许他们在授权步骤中直接发送用户名和密码(这样我就可以进行本机登录对话)。前提是您的API通过SSL/HTTPS

    3
    对于我的web应用程序,我使用cookie身份验证来访问API。也就是说,在登录之后,用户可以简单地调用API:url并返回JSON/XML。很适合快速浏览API(尽管像APIGee这样的真正的API控制台在这方面做得更好)。

    服务层是什么意思?是控制器内的模型完成了所有的起重工作吗?如果是这样的话,那么这就是我的计划——真正让我感到困惑的是身份验证。我想将所有业务逻辑转移到一个单独的API子域,因为我们需要将其公开用于移动应用程序开发,我认为这将有助于提高可伸缩性,因为我可以增加或减少连接到API的哑客户端的数量,只需让中央API处理所有数据缓存。我对可伸缩性还不太了解…你能详细说明第3项吗?当用户登录时,您是否将会话id保存在cookie中,然后在进行API调用时将其用作伪访问令牌,然后在收到API请求时进行查找?这似乎是一个安全漏洞…本质上是的。但这怎么会是一个漏洞呢?从web应用程序调用API时,我不使用OAuth。如果您已登录(由验证cookie确定),则只需调用URL即可访问API。不过,我确实忘了提到,我在同一个域上为web应用程序提供API:s。我想,只要您不完全依赖会话id来识别服务器端的用户,就不会这样。我在想你可以向我敞开心扉,但今天是放学后的星期五,我累了。根据你对其他问题的回答,你肯定是一个知识渊博的家伙!谢谢你的帮助!不,当然,您的会话cookie应该通过SSL传输,有一个非常长且非常随机的值,每个请求都会重新生成该值,如果用户在给定时间内处于非活动状态,则该值将过期,等等。但是如果您正确处理会话cookie。。。你应该准备好了。你如何确保在使用用户名密码流时,不会有人只是反编译你的移动应用程序、窃取密钥和模拟你的应用程序?这是不可避免的吗?