30

Webサービスを構築していますが、ユーザーのGoogleアカウントのクレデンシャルを使用したいと思います。

このサービスはGAEで実行され、WebクライアントとAndroidネイティブクライアントがあります。

これは、このようなものの私の最初の試みであり、OpenIDとAndroidAccountManagerライブラリについて読んでいます。

ユーザーをデータストアに保存するという点で、どのようなオプションがあるのか​​まだわかりません。どの識別子を使用する必要がありますか?ネイティブAndroidアプリケーションでOpenIDを使用することは可能ですか?

ヘルプやポインタをいただければ幸いです。ありがとう。

4

4 に答える 4

31

前回のプロジェクトでも同様の要件がありました。GWTフロントエンドを備えたGAEバックエンドとAndroid/iPhoneクライアントです。また、ユーザーの資格情報を保存したくありませんでした。

そのため、OpenIDを使用することにしました。これは、残念ながらWeb標準であり、モバイルデバイスではうまく機能しませんが、実行可能です。

GAE側では、OpenIDを提供するフェデレーションログインを有効にするだけです。

モバイルデバイスでは、ユーザーがログインする必要がある場合、OpenIDオーセンティケーター(Google、Yahooなど)のリストを提示します。次に、ネイティブブラウザ(埋め込みブラウザではない)を開き、選択したOpenID認証サイトにユーザーを誘導します。利点は、通常、ユーザーのブラウザにはすでにユーザー名/パスが記憶されているため、この手順ではユーザーが1つのボタンを押すだけで済みます。

これはすべて非常に簡単です。ここで注意が必要な部分があります。ユーザーがログインを確認すると、OpenIDはGAEリターンURLにリダイレクトします(リクエストが行われたときにこのURLを提供する必要があります)。このURLに、次のようなカスタムURLを作成します。

yourappname://usrname#XXXYYYZZZ

ここで、XXXYYYZZZZは認証トークンです。このトークンは、ACSID Cookieとして保存されているリターンページから取得します。JSPを使用してこのCookieを読み取り、上記のカスタムURLにラップしました。

次に、AndroidアプリとiPhoneアプリを登録してyourappname://URLを処理します。これにより、ユーザーがこのリンクをクリックすると、アプリが呼び出され、リンクが渡されます。このリンクからユーザー名とトークンを抽出し、GAEバックエンドへのRESTリクエストで使用します。

他にご不明な点がございましたら、この投稿を更新させていただきます。

アップデート:

本番AppEngineのユーザーセッションCookieの名前ACSIDは、開発AppEngineサーバーのユーザーセッションCookieの名前dev_appserver_loginです。

于 2011-02-17T14:16:21.113 に答える
12

私は約1週間かけて、これに適したモダンな方法を見つけました。Webブラウザーを使用せずに、Androidアカウントマネージャーを使用しました。

GoogleアカウントとAccountManagerを使用してユーザーを特定する場合は、次のことができます。

  1. バックグラウンドスレッドのAccountManagerを介して、彼のトークンをGoogleコンタクト(認証トークンタイプは「cp」)に取得します。

    public String getUserToken(Activity activity)
    {
        AccountManager accountManager = AccountManager.get(activity);
        AccountManagerFuture<Bundle> amf = accountManager.getAuthTokenByFeatures("com.google", "cp", null, activity, Bundle.EMPTY, Bundle.EMPTY, null, null );
    
        Bundle bundle = null;
        try {
            bundle = amf.getResult();
            String name = (String) bundle.get(AccountManager.KEY_ACCOUNT_NAME);
            String type = (String) bundle.get(AccountManager.KEY_ACCOUNT_TYPE);
            String token = bundle.getString(AccountManager.KEY_AUTHTOKEN);
            return token;
        } catch (OperationCanceledException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (AuthenticatorException e) {
            e.printStackTrace();
        }
        return null;
    }
    
  2. 受信したUserTokenをセキュリティで保護されたチャネルを介してサーバーに渡します。

  3. gdataライブラリ(Google Data APIライブラリ)を使用して、Googleによってサーバーでトークンを検証します。

    public String getUserId(String token)
    {
        ContactsService contactsService = new ContactsService("Taxi");
        contactsService.setUserToken(token);
    
        IFeed feed = null;
        try {
            feed = contactsService.getFeed(new URL("https://www.google.com/m8/feeds/contacts/default/full?max-results=10000"), ContactFeed.class);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ServiceException e) {
            e.printStackTrace();
        } catch (NullPointerException e) {
            e.printStackTrace();
        }
    
        if (feed == null)
            return null;
    
        String externalId = feed.getId();
        IPerson person = feed.getAuthors().get(0);
        String email = person.getEmail();
        String name = person.getName();
        String nameLang = person.getNameLang();
    
        return externalId;
    }
    
  4. Googleトークンは期限切れになる可能性があるため(通常は1時間後)、サーバーでトークンの検証に失敗した場合は、クライアントに応答を返送し、トークンを無効にして新しいトークンを取得する必要があります。アカウントマネージャーを使用してトークンを無効にします。

    public void invalidateUserToken(Context context, String token)
    {
        AccountManager accountManager = AccountManager.get(context);
        accountManager.invalidateAuthToken("com.google", token);
    }
    
于 2011-07-13T14:50:01.160 に答える
3

このブログ投稿はまさにあなたが望むことをしていると思います。それは私のために働いた。ここに掲載されている解決策はどちらも実行可能で賢いものですが、これは質問者が求めていた方法とまったく同じだと思います。

基本的に、「ah」スコープを使用してauthTokenを取得し、それを適切なWebページに渡して、認証にUserServiceを使用するAppEngineページにアクセスできるACSIDCookieを取得します。

于 2012-12-18T17:16:05.633 に答える
0

http://developer.android.com/search.html#q=AccountManager&t=0

http://developer.android.com/resources/samples/SampleSyncAdapter/index.html このページの下部に必要なすべてのコードがあります

よろしくお願いします

于 2010-09-02T09:44:54.170 に答える