6

编辑最初我认为 Oauth2 是要走的路,但也许不是。我暂时将其排除在这个问题之外,因为它令人困惑。

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

此外,此令牌需要有超时才能在需要时刷新。比如凭证发生了变化。

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

有没有关于如何实现这一点的教程(最好是使用 Joomla)?有人可以指点我吗?

4

5 回答 5

3

您应该从移动应用程序中发布用户名和密码,然后您应该遵循此问题中提供的解决方案: https ://stackoverflow.com/a/2188969/900617

于 2013-01-30T15:24:28.550 回答
3

最终解决方案是创建我自己的 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

将所有内容放入控制器中的捷径,但希望您能明白这一点。

于 2013-01-30T18:43:42.757 回答
1

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

如果您想使用 oAuth,那么您的移动应用程序将被视为oAuth-client。您的“服务器”拥有“受保护的资源”,它只能与 oAuth 访问令牌一起使用,因此称为“资源服务器”。现在你想要一些东西来提供这个访问令牌,所以这是身份提供者,AKA 身份验证服务器,例如 Facebook,Google,(或者你自己实现一个)。

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

如果是真的——你仍然可以自己实现所有东西,而不使用 Facebook/Google API,因为 oAuth 有 SPEC。但是,您可以更轻松地使用提供商的软件包。

编辑:重新考虑 oAuth 的使用

仅当您希望您的 web 应用程序支持 oAuth SPEC 时才使用 oAuth。有几个好处,其中之一是您可以使用第 3 方身份提供者,例如 Yahoo! 并在不管理他们的情况下使用他们的身份。因此,如果我有 Yahoo! 的用户,我无需额外注册即可使用您的应用程序(您的应用程序必须支持来自 Yahoo! 的访问令牌)。但是在您的情况下,您将要实现身份提供者的所有逻辑(忘记密码、更改密码、注册等)以及支持 oAuth - 所有这一切都完全没有享受 oAuth 的好处!所以 - 你必须重新考虑oAuth的使用......

于 2013-01-26T21:00:45.707 回答
0

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

于 2013-01-28T21:06:51.680 回答
0

这不是 Joomla 或教程,(我对 php 很生疏)说...

首先要注意几点: * memcache 不安全,并且这个实现让你输入用户名/密码:确保它安全地位于防火墙后面,或者先加密它。如果您需要,很乐意提供一些指示。* memcache 不能保证在内存不足时不会丢弃数据。在实践中它是可靠的,但你的应用程序应该优雅地处理它。如果您不想丢失这样的数据,只需将诸如 couchbase 之类的东西替换为 memcache。* 仅仅返回一个令牌来响应登录可能不是很有用。我会将令牌连同用户名之类的内容以及任何其他信息进行 json 化,以使应用程序启动并运行,而无需进行第二次 API 调用。* 下面的代码不处理错误情况,如果这对您来说不明显,我可以更详细地调用它们。

如果是我,我会使用 memcache 来保存令牌并将该令牌映射到最初传递的用户名和密码。您可以使用 memcache 的生存时间免费获得您的到期时间。

将用户名/密码发送到服务器(最好通过 https)。创建一个随机字符串或 guid(例如: http: //php.net/manual/en/function.uniqid.phphttp://www.lateralcode.com/creating-a-random-string-with-php/) , 这是你的令牌 将用户名/密码存储在内存缓存中,将该令牌作为键设置超时

$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 中工作的函数...

于 2013-02-02T18:40:28.547 回答