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クライアントと見なされます。「サーバー」は「保護されたリソース」を保持し、oAuthアクセストークンでのみ使用できるため、「リソースサーバー」と呼ばれます。ここで、このアクセストークンを提供するものが必要なので、これはIDプロバイダー、別名認証サーバー(Facebook、Googleなど)です(または独自に実装します)。

フローは(一般的に)次のとおりです。ユーザー(モバイルアプリ)は保護されたリソースに到達しようとします。トークンがないため、彼はauth-serverにリダイレクトされています。後者は、ユーザー/パスワードのログインページとトークンの作成を担当します。

それが本当なら-oAuthにはSPECがあるので、Facebook / Google APIを使用せずに、すべてを自分で実装できます。ただし、プロバイダーのパッケージを使用する方が簡単な場合があります。

編集:oAuthの使用法を再考する

WebアプリでoAuthSPECをサポートする場合にのみ、oAuthを使用します。いくつかの利点がありますが、そのうちの1つは、Yahoo!などのサードパーティのIDプロバイダーを使用できることです。管理せずにIDを使用します。したがって、Yahoo!にユーザーがいる場合は、追加の登録なしでアプリを使用できます(アプリは、Yahoo!からのアクセストークンをサポートする必要があります)。しかし、あなたの場合、IDプロバイダーのすべてのロジック(パスワードの忘れ、パスワードの変更、登録など)に加えて、oAuthのサポートを実装しようとしています-そして、これらすべては、oAuthの利点をまったく享受することなく!つまり、oAuthの使用法を再考する必要があります...

于 2013-01-26T21:00:45.707 に答える
0

これはJoomlaでもチュートリアルでもありません(そして私はphpで非常に錆びています)...

最初のいくつかの注意点:* memcacheは安全ではなく、この実装ではユーザー名/パスワードを入力する必要があります。ファイアウォールの背後に安全に配置されていることを確認するか、最初に暗号化してください。必要に応じて、その点についていくつかの指針を示してください。* memcacheは、メモリが不足した場合にデータをドロップしないことが保証されていません。実際には信頼できますが、アプリはそれを適切に処理する必要があります。そのようなデータを失いたくない場合は、memcacheの代わりにcouchbaseのようなものを使用してください。*ログインに応答してトークンを返すだけでは、おそらくあまり役​​に立ちません。トークンをユーザー名やその他の情報と一緒にjson化して、2回目のAPI呼び出しを行わなくてもアプリを起動して実行できるようにします。*以下のコードはエラーの場合を処理しません。それが明らかでない場合は、それらすべてをより詳細に呼び出すことができます。

私の場合は、memcacheを使用してトークンを永続化し、そのトークンを最初に渡されたユーザー名とパスワードにマップします。memcache時間を使用して、有効期限を無料で取得できます。

ユーザー名/パスワードをサーバーに送信します(理想的にはhttps経由)。ランダムな文字列またはGUIDを作成します(例:http://php.net/manual/en/function.uniqid.phpまたはhttp://www.lateralcode.com/creating-a-random-string-with-php/) 、これはあなたのトークンですユーザー名/パスワードをそのトークンをキーとして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で動作するように見える関数にクリーンアップしました...

于 2013-02-02T18:40:28.547 に答える
0

それらの API をベースとして使用する必要があります。彼らは、データベースに接続する独自の API を構築できるようにするだけではなく、API というよりもパスワード クラッカーのように見えます。

于 2013-01-28T21:06:51.680 に答える