创建一个以Api为中心的应用程序,我自己的疑虑

时间:2013-04-11 13:46:52

标签: php mysql api oauth yii

我试图围绕所有这些“以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 /其他人这样做),问题是,我如何区分简单的用户创建的应用程序和我自己的应用程序(如网站和移动应用程序)?在请求永久时提供各种“范围”,这种分离是否可行? 如果没有,我应该使用其他什么方法?

我对oauth没有太多经验,所以也许有些问题有点不对,希望你明白我的问题。

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

谢谢:)

1 个答案:

答案 0 :(得分:0)

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);

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