15

JSON を使用した一連の Web API 呼び出しを通じて、モバイル アプリ (Android/IPhone) が GAE バックエンド (Python) と通信するアプリの作成を開始しています。

認証に Google アカウントを使用できないため、独自の認証を実装する必要があります。これを行う方法についてはアイデアがありますが、より良い方法があるかどうかはわかりません。

以下を達成する方法のいくつかのコード例/提案を手伝ってくれる人はいますか?

方法

  1. モバイル アプリは、ストアでセッション キーを認証して作成し、これをアプリに返すサーバーで Login メソッドを呼び出します。キー/セッションの生成方法や、要求/応答のどこにあるべきかわかりません。
  2. すべての呼び出しで、アプリはサーバーが認証するためにこのキーを渡し、合格した場合はアクションを許可します。
  3. 明示的にログアウトするかキーを紛失しない限り、ユーザーはモバイルで再度ログインする必要はありません。

ログイン方法 - キー生成なし

class Login(webapp.RequestHandler):
def post(self):
    args = json.loads(self.request.body)
    email = args['e']
    pwd = args['p']
    ret = {}
    user = User.gql('WHERE email = :1', email).get()
    if user and helpers.check_password(pwd, user.password):
        ret['ret_code'] = 0
        ret['dn'] = user.display_name
    else:
        ret['ret_code'] = 1

    self.response.headers['Content-Type'] = 'application/json'
    self.response.out.write(json.dumps(ret))
4

6 に答える 6

1

カスタム登録を実装するには、webapp2 が提供する機能を使用する必要があると思います。

from webapp2_extras import auth
from google.appengine.api import users

class RegisterHandler(webapp2.RequestHandler):
    def post(self):
        email=self.request.POST['email']
        password=self.request.POST['password']

        #Let webapp2 handle register and manage session
        user = auth.get_auth().store.user_model.create_user('own:'+str(email), password_raw=password,email=email)
        #user (True, User(key=Key('User', 80001), auth_ids=[u'own:useremail@mail.com'],email='useremail@mail.com',password=u'hashed_password',...))

        if not user[0]: #user is a tuple
            self.response.write(user[1]) # Error message
        else:
            #You can extend your User Model e.g UserProfile(User): or have a UserProperty in your profile model as the example.  
            profile=UserProfile(user=users.User(user[1].email)).put()

            self.response.write(str(profile.key()))
class LoginHandler(webapp2.RequestHandler): 

    def post(self):

        email = self.request.POST.get('email')
        email = self.request.POST.get('password')
        # Try to login user with password
        # Raises InvalidAuthIdError if user is not found
        # Raises InvalidPasswordError if provided password doesn't match with specified user
        try:
            auth.get_auth().get_user_by_password('own:'+email, password)
            #Return user_session with User id, 
        except InvalidPasswordError, InvalidAuthIdError:
            #Error

ログインしているユーザーは、次の方法で確認できます。

if auth.get_user_by_session():
    #Logged in      
else:
    #Not logged in

クライアント アプリケーション (Android、IOS) で。応答 Cookie を保存し、サブシーケンス要求ごとに送信するだけです。

幸運を :)

于 2012-06-26T06:55:04.537 に答える
0

セッション、認証、JSONを使用したwebapp2およびwebapp2エクストラをご覧ください

于 2012-06-24T17:40:27.433 に答える
0

セッションなどを明示的に使用したくない場合は、データストアを使用できます。これに従ってみてください:

  1. 一意のデバイスID/電子メールを取得して、各一意のユーザーを識別します。
  2. 特定のユーザーからの要求に応じて、ランダムな認証キーを生成し、それをユーザーの電子メール/デバイスIDと、おそらく現在のタイムスタンプとloggedInフラグに添付して保存します。

だからあなたは持っています:

User email/id: someone@example.com
password: xxxxxxxxxx
Key : 2131231312313123123213
Timestamp: 20:00 12-02-2013
loggedIn : boolean value

これはデータベースモデルにすることができます。これで、ユーザーがログインするたびに:

  • メールアドレスとパスワードの組み合わせを確認してください。
  • 有効な場合は、ランダムキーを生成し、データストアを新しいキーで更新します
  • タイムスタンプを現在の時刻で更新し、 loggedInTrueに設定します
  • 次に、JSONオブジェクトでキーをクライアント(Android / iPhone)に返します。

これで、すべてのリクエストで、受信したキーをデータストア内のキーと照合し、loggedInフラグがtrueに設定されているかどうかを確認します。両方ともOKの場合、リクエストを処理します。

また、ログアウト時:

  • データストアのloggedInフラグをFalseに設定するだけです。

お役に立てれば :)

于 2013-02-05T07:44:41.400 に答える
0

セッション管理にはgae-sessionsを試してください。安全な Cookie を作成し、データを各ユーザーに簡単に関連付けることができます。最初の認証に独自のロジックを提供するだけです。

これは App Engine 専用に構築されており、非常に人気があり、非常に高速でスケーラブルです。

https://github.com/dound/gae-sessions

于 2013-02-18T10:15:50.080 に答える
0

これを行うには多くの方法があります。

1) ユーザーのログインの詳細をチェックアウトする場合は、ランダムな UUID または文字列を作成し、ランダムな文字列をキーとしてユーザー オブジェクトを値として memcache にユーザー オブジェクトを格納できます。次に、応答ヘッダーとともにランダムな文字列を返します。モバイルで応答を解析しているときに、このヘッダーを取得してローカル キャッシュに保存します。以降のすべてのリクエストでは、リクエスト ヘッダーでこのキーを送り返し続け、コントローラーでこのキーを使用して memcache からユーザー オブジェクトを取得し、続行します。オブジェクトが memcache にない場合は、ユーザーにログインを促す応答を返すことができます。

2) memcache を使用したくない場合は、ユーザー オブジェクトをセッションに格納し、クライアント側で応答を解析しながら、応答からセッション ID を取得できます。通常は JSESSIONID です。次に、それを保存し、さらなる要求で再送信します。コントローラーでは、現在のセッションにユーザー オブジェクトがあるかどうかを確認できます。それ以外の場合はログインを強制します。

1) もう 1 つの方法は、応答と共にユーザーの appengine キーを返し、それを再送信することです。

応答から応答ヘッダーを取得するだけです。次に、SESSIONID/JSESSIONID ヘッダーを取得し、同じ名前と値を持つフィールドを保存して、以降のすべてのリクエスト ヘッダーに追加します。それが最も簡単な方法です。

私がpythonを知っていれば、スタックオーバーフローとコードの例がないという私の最初の答え。

于 2013-03-19T22:24:17.867 に答える
0

セッションが必要な理由がわかりません。App Engine のセッションはデータ ストアに永続化されるため、リクエストをステートレスに保つことができる場合は、そうすることをお勧めします。

ユーザーを認証する独自のユーザー サービスがあるため、シークレットが要求に含まれることがないため、ダイジェスト認証を使用することをお勧めします。

ほとんどのクライアントおよびサーバー プラットフォーム用に Digest を実装するライブラリがあります。

于 2013-01-06T05:40:11.710 に答える