Php 移动应用程序开发-如何创建服务器实现

Php 移动应用程序开发-如何创建服务器实现,php,authentication,mobile,joomla2.5,Php,Authentication,Mobile,Joomla2.5,编辑最初我认为Oauth2是一个不错的选择,但也许不是。我暂时不提这个问题,因为这会让事情变得混乱 我正在创建一个移动应用程序(Android/iOS)。我希望用户在移动设备中输入他们的凭据(用户/通行证),然后将其发送到我的服务器(Joomla CMS),以验证凭据并创建/发送令牌。我不想在设备上存储user/pass,只想存储令牌 此外,此令牌需要有一个超时,以便在需要时刷新。例如凭据已更改 在这一点上,我正试图弄清楚它的架构会是什么样子 有没有关于如何实现这一点的教程(最好是使用Jooml

编辑最初我认为Oauth2是一个不错的选择,但也许不是。我暂时不提这个问题,因为这会让事情变得混乱

我正在创建一个移动应用程序(Android/iOS)。我希望用户在移动设备中输入他们的凭据(用户/通行证),然后将其发送到我的服务器(Joomla CMS),以验证凭据并创建/发送令牌。我不想在设备上存储user/pass,只想存储令牌

此外,此令牌需要有一个超时,以便在需要时刷新。例如凭据已更改

在这一点上,我正试图弄清楚它的架构会是什么样子


有没有关于如何实现这一点的教程(最好是使用Joomla)?有人能给我指出什么吗?

我希望我能正确理解您的用例

如果要使用oAuth,则您的移动应用程序将被视为oAuth客户端。 您的“服务器”持有“受保护的资源”,并且它只能与oAuth访问令牌一起使用,因此它被称为“资源服务器”。现在你需要一些东西来提供这个访问令牌,所以这就是身份提供者,也就是身份验证服务器,例如Facebook、Google(或者你自己实现一个)

流程(通常):用户(移动应用程序)尝试访问受保护的资源;因为它没有令牌,他被重定向到身份验证服务器。后者负责用户/密码登录页面,并创建令牌

如果这是真的,那么您仍然可以自己实现所有功能,而无需使用Facebook/Google API,因为oAuth有规范。但是,您可以更轻松地使用提供商的软件包

编辑:重新考虑oAuth的用法


只有当您希望您的Web应用程序支持oAuth规范时,才可以使用oAuth。这有几个好处,其中之一是您可以使用第三方身份提供商,例如Yahoo!使用他们的身份而不管理他们。所以如果我在雅虎有一个用户!,我可以使用你的应用程序而无需额外注册(你的应用程序必须支持雅虎的访问令牌!)。但是在您的例子中,您将要实现身份提供者的所有逻辑(忘记密码、更改密码、注册等)以及支持oAuth,而所有这些都没有享受oAuth的好处!因此-您必须重新考虑oAuth的使用…

您需要使用他们的API作为基础。他们不会让你建立自己的API连接到他们的数据库,对他们来说,这更像是一个密码破解程序,而不是API。

你应该在移动应用程序中发布用户名和密码,从那里开始,你应该遵循这个问题中提供的解决方案:

最终解决方案是创建我自己的Joomla组件。几乎所有东西都在我的控制器里。不是最终的代码,但是类似的东西可以工作

defined('_JEXEC') or die;
jimport('joomla.application.component.controller');

class FooauthController extends JController
{
function __construct() {
    // params
    $jinput = JFactory::getApplication()->input;
    $this->username = $jinput->get('user', '', 'STRING');
    $this->password = $jinput->get('password', '', 'STRING');
    $this->checkParameters();
}

private function checkParameters() {
    // datatype checks

    if ($this->username == '' || $this->password == '') {
        header('HTTP/1.1 400 Bad Request', true, 400);
    }

}

private function createToken() {
    // token generation - what Joomla does (just an example)
    jimport('joomla.user.helper');
    $salt   = JUserHelper::genRandomPassword(32);
    $crypted  = JUserHelper::getCryptedPassword($password, $salt);
    $cpassword = $crypted.':'.$salt;
    return $cpassword;
}

function execute() {
    // Get the global JAuthentication object
    jimport( 'joomla.user.authentication');
    $auth = & JAuthentication::getInstance();
    $credentials = array( 'username' => $this->username, 'password' => $this->password );
    $options = array();
    $response = $auth->authenticate($credentials, $options);

    // success
    if ($response->status === JAUTHENTICATE_STATUS_SUCCESS) {
        $response->status = true;
        echo json_encode($this->createToken());
    } else {
        // failed
        $response->status = false;
        echo json_encode($response);
    }

}
}

这表示一个名为com_fooauth的组件。现在,本机应用程序将发送如下查询:

http://www.myhost.com/index.php?option=com_fooauth&user=username&password=pass&format=raw

这是一条将所有内容都放在控制器中的捷径,但希望您能理解。

这不是Joomla或教程(我对php非常生疏),它说

首先,有几个注意事项: *memcache是不安全的&这个实现让你把用户名/密码放进去:确保它安全地放在防火墙后面,或者先加密它。如果你需要的话,很乐意给你一些建议。 *memcache无法保证在内存不足时不会删除数据。实际上,它是可靠的,但你的应用程序应该优雅地处理它。如果您不想这样丢失数据,只需用couchbase之类的东西替换memcache即可。 *仅仅返回一个令牌作为对登录的响应可能不是非常有用。我会将令牌与用户名等信息一起json化,以使应用程序启动并运行,而无需进行第二次API调用。 *下面的代码不处理错误情况,如果您不清楚,我可以更详细地调用它们

如果是我,我只需要使用memcache来持久化令牌&将该令牌映射到最初传递的用户名和密码。您可以使用memcache time to live免费获取过期信息

向服务器发送用户名/密码(最好是通过https)。 创建一个随机字符串或guid(例如:或),这是您的令牌 将用户名/密码作为密钥存储在memcache中 设置一个超时

$token = createToken("user1234", "pass2324");

print "Token: $token \n\n";

$credentials = credtialsFromToken($token);

print "Credentials from the token: ";

var_dump($credentials);

print "\n\n";


function setup() {
    $memcache = new Memcache;
    $memcache->connect('localhost', 11211) or die ("Could not connect");    
}

function createToken($user, $pass) {
$TOKEN_EXPIRE_TIME=60 * 60 * 24 * 30;

$credentials = array(
      "user" => $user,
      "pass" => $pass,
);

$token = uniqid(  );
memcache_set($token, credentials, 'some variable', 0, 30);

return $token;
}

function credtialsFromToken($token) {
$credentials = memcache_get($token);
return $credentials;
}
如果令牌不正确或已过期,他们将返回空凭据并必须登录


编辑:将其清理成似乎在php中工作的函数

我不知道你在说什么。我相信
资源服务器
授权服务器
将是相同的(在我的例子中是Joomla)。我不明白为什么我会使用Facebook或Google API,因为我不打算让用户通过FB或Google登录他们的移动应用程序?他们需要使用Joomla进行身份验证,所以我不需要构建自己的实现吗?通常在oAuth中,授权服务器和资源服务器不是同一个应用程序。以谷歌为例:你有谷歌帐户(oAuth服务器)和日历或GMail,它们是“资源服务器”的应用程序,使用谷歌帐户作为身份提供者。在您的情况下,如果您愿意,它们可以合并在一起-我知道有些情况下它们作为一个应用程序出现。您想使用Joomla作为身份验证服务器吗?Joomla是否充当身份验证服务器?(我不知道)。或者,您希望使用Joomla开发的应用程序成为身份验证提供商?区别很重要……Joomla是一个具有自己身份验证的CMS。因此,我在Joomla中构建了一个站点,用户可以登录到我们的站点,并且受保护的资源在那里(因此
资源服务器
)。向客户端发出令牌的服务器也将是Joomla内部的组件(或插件)(因此
授权服务器
)。