【问题标题】:Creating an Api-Centric Application, my own doubts创建一个以 API 为中心的应用程序,我自己的疑惑
【发布时间】:2013-04-03 17:57:46
【问题描述】:

我正试图围绕所有这些“以 api 为中心”的概念展开思考,不知何故,由于各种原因(在颠倒之后)我无法自己找到答案,所以我希望你能帮助我:)

在这里,作为个人项目的一部分,我需要创建一个类似社交应用程序网站的东西,我说“喜欢”,因为它只是一个小项目,没什么太花哨的。

我的想法是创建一个休息服务,比如http://api.domain.com/v1/ 以及所有需要的资源方法(创建/删除/更新/读取)。

现在,在创建此服务之后,我需要创建我的网站,例如 http://www.domain.com/,并且该网站将与我的 api.domain.com 进行通信以执行它所做的每个操作。如果有新用户注册,则将数据发送到 api 服务器,进行处理,返回答案等。

然后,网站创建完成后,我打算使用phonegap 为iphone 和android 创建一个原生应用程序。这些移动应用程序基本上就像我的网站一样,连接到 api 服务器并执行各种操作。

如果不涉及授权,这非常简单,所以任何知道 api 端点的人都可以管理所有资源,正如你猜想的那样,我不想要,所以我必须实现某种授权机制,我不确定要使用什么。 我正在考虑实施 OAuth2,以便我的 api 充当 oauth 提供者,然后我的网站/移动应用程序将连接到 api,获得授权,然后完成他们的工作。 这是一个好方法,有什么想法吗?

接下来,假设我坚持使用 oauth 并且一切正常,如果我想让我的用户有机会创建自己的应用程序来访问有关其他用户/或他们自己的数据的信息(基本上我有一个公共 api ,为什么不利用它),那么将安装该应用程序的用户将需要批准它才能访问他的信息。我知道这对于 oauth 是可能的(因为 facebook/twitter/others 这样做),问题是,我如何区分简单的用户创建的应用程序和我自己的应用程序(如网站和移动应用程序)?这种分离是否可以通过在请求权限时提供各种“范围”来实现? 如果没有,我应该使用什么其他方法?

我对 oauth 没有太多经验,所以可能有些问题有点错误,希望你能明白我的问题。

如果有帮助,我将使用 PHP 5.4 和 Yii 框架、Apache 2(可用 mod ssl)、MySQL。

谢谢:)

【问题讨论】:

    标签: php mysql api oauth yii


    【解决方案1】:

    Yii 提供 CWebService (SOAP),你可以使用它,或者创建你自己的 REST API。

    我自己创建了一个 API,就像你想要的那样。

    为了安全起见,我使用 CUserIdentity 使用 api 用户名和 api 密码登录:

    if (Yii::app()->apiuser->isGuest) {
    
                  if (!empty($_POST['apiUser']) && !empty($_POST['apiPassword'])) {
    
                    $identity = new ApiUserIdentity($_POST['apiUser'],$_POST['apiPassword']);
                    $identity->authenticate();
    
                    if($identity->errorCode===ApiUserIdentity::ERROR_NONE)
                    {
    
                        Yii::app()->apiuser->login($identity); // Login for 30 minutes
                        $responseData['success'] = 1;
                        $responseData['sessionId'] = Yii::app()->session->sessionID;
    
                    } else {
    
                        $responseData['error'] = 'Incorrect username and/or password';
    
                    }
    
                  }
    
              }
    

    POST 数据来自它使用 api 的应用程序。 SessionId 被传回应用程序,因此不需要下次登录。如果您使用 CURL 发出 api 请求,您可以使用以下命令将会话 ID 发送回下一个 api 请求:

    $strCookie = "PHPSESSID=".$sessionId."; path=/";
    // Set the COOKIE files
    curl_setopt($ch, CURLOPT_COOKIESESSION, true );
    curl_setopt($ch, CURLOPT_COOKIE, $strCookie);
    

    这样每次下一个请求都会保持会话。

    【讨论】:

    • 是的,但这打破了 REST 的所有含义,它不再是无状态的,因为您使用会话来保持用户登录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-25
    • 2021-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多