2010-11-17 33 views
9

Tôi muốn hỏi, cách tốt nhất để xác thực người dùng bằng tài khoản Google của anh ấy đã được định cấu hình trên điện thoại là gì. Tôi đã xem xét ClientLogin trước, nhưng nó không phải là những gì tôi muốn vì nó yêu cầu người dùng nhập tên đăng nhập/mật khẩu trong ứng dụng của tôi. Tôi có thể làm điều đó với OAuth nhưng ở đó tôi nên yêu cầu người dùng nhập thông tin đăng nhập của mình vào trình duyệt cũng không thích hợp hơn. Tôi muốn sử dụng AccountManager (Tôi đã quan sát thấy nó chứa phương thức getPassword cho tài khoản cụ thể nhưng nó không hoạt động đối với tôi), nếu có thể sử dụng bằng cách nào đó AccountManager + ClientLogin hoặc AccountManager + OAuth, hãy cho tôi biết. Kết quả là tôi muốn có khả năng đăng nhập bằng tài khoản Google của người dùng mà không hỏi đăng nhập/mật khẩu của mình (tôi chắc chắn là có thể) nhưng nếu có cách nào đó để thực hiện điều này, hãy chỉ cho tôi cách. ..Android: Xác thực của Google

+0

sẽ rất tuyệt nếu bạn bỏ phiếu cho câu trả lời đúng cho câu hỏi của bạn. hoặc, trong trường hợp không phù hợp với nhu cầu của bạn, hãy bình luận về chúng. làm cho chúng tôi, người trả lời (bạn đã bình luận một lúc) cảm thấy đánh giá cao cho những nỗ lực của chúng tôi để giúp bạn ra ngoài. :) –

Trả lời

0

Từ một câu hỏi stackoverflow trong feb2010: Anyway to Authenticate a user using Google Apps in an Android application?

và bài bài viết blog: http://javagwt.blogspot.com/2009/12/authenticating-android-app-to-google.html

Hãy nhớ rằng, sự khác biệt bây giờ là Google không xác thực hai bước ngay bây giờ để bạn có thể phải sửa đổi một số bước.

+0

Tôi đã đọc điều này rồi ...cụ thể hơn, tôi hiểu cách thực hiện với cơ chế OAuth, đây là cách tốt để xác thực với các dịch vụ khác như twitter, nhưng tài khoản google đã được hỗ trợ trên điện thoại Android và tôi muốn sử dụng bước đó để người dùng nhập thông tin đăng nhập của mình chỉ cần xác nhận rằng ứng dụng của tôi sẽ sử dụng tài khoản của mình để lấy dữ liệu ... những gì khác ... Tôi dự định truy xuất dữ liệu không phải từ công cụ ứng dụng mà từ nhiệm vụ google – endryha

3

Bạn có thể sử dụng xây dựng trong lý Tài khoản:

Account[] accounts = accountManager.getAccountsByType("com.google"); 

Sau đó trích xuất các tài khoản mà bạn muốn từ danh sách trả lại. Bước tiếp theo là gọi AccountManager.getAuthToken.

Khi bạn có authToken, bạn có thể vượt qua nó vào API của Google bằng cách gọi:

api.setUserToken(token); 

như trái ngược với setUserCredentials mà yêu cầu người dùng và mật khẩu.

8

có, bạn có thể truy cập thông tin trong tài khoảnQuản lý và xác thực người dùng bằng tài khoản google đã đăng ký (ví dụ) mà không cần nhập mật khẩu của mình.

mã dưới đây là một kết hợp chức năng và kết hợp từ các ví dụ bằng cách nick johnson và bởi tencent

bắt đầu với hoạt động chính của bạn:

package com.tg.auth; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.app.ListActivity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class ZAuth02aActivity extends ListActivity { 
    protected AccountManager accountManager; 
    protected Intent intent; 
    String TAG = "TGtracker"; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     accountManager = AccountManager.get(getApplicationContext()); 
     Account[] accounts = accountManager.getAccountsByType("com.google"); 
     this.setListAdapter(new ArrayAdapter<Account>(this, R.layout.list_item, accounts));   

    } 

    @Override 
    protected void onListItemClick(ListView l, View v, int position, long id) { 
     Account account = (Account)getListView().getItemAtPosition(position); 
     Intent intent = new Intent(this, AppInfo.class); 
     intent.putExtra("account", account); 
     startActivity(intent); 
    } 
} 

tạo một lớp AppInfo:

package com.tg.auth; 


import org.apache.http.impl.client.DefaultHttpClient; 

import android.accounts.Account; 
import android.accounts.AccountManager; 
import android.accounts.AccountManagerFuture; 
import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 

public class AppInfo extends Activity { 
    DefaultHttpClient http_client = new DefaultHttpClient(); 
    Activity activity; 
    String TAG = "TGtracker"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.app_info); 
     activity = this; 

    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     //Log.v(TAG, "resuming activity"); 
     AccountManager accountManager = AccountManager.get(getApplicationContext()); 
     //if result is null, you might not have a valid internet connection 
     Log.i(TAG, "got token, yipee: "+updateToken(accountManager, true)); 
    } 


    private String updateToken(AccountManager am, boolean invalidateToken) { 
     String authToken = "null"; 
     try { 
      Account[] accounts = am.getAccountsByType("com.google"); 
      AccountManagerFuture<Bundle> accountManagerFuture; 
      if(activity == null){//this is used when calling from an interval thread 
       accountManagerFuture = am.getAuthToken(accounts[0], "android", false, null, null); 
      } else { 
       accountManagerFuture = am.getAuthToken(accounts[0], "android", null, activity, null, null); 
      } 
      Bundle authTokenBundle = accountManagerFuture.getResult(); 
      authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN).toString(); 
      Log.v(TAG, "newToken preinvalidate: "+authToken); 

      if(invalidateToken) { 
       am.invalidateAuthToken("com.google", authToken); 
       authToken = updateToken(am, false); 

      } 
     } catch (IOException e) { 
      Log.e(TAG, "the exception was: "+e.toString()); 
      e.printStackTrace(); 
     } 
     return authToken; 
    } 
} 

sử dụng tệp kê khai, tương tự như vậy (phải khai báo các hoạt động + quyền):

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.tg.auth" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="7" /> 
    <uses-permission android:name="android.permission.MANAGE_ACCOUNTS"></uses-permission> 
    <uses-permission android:name="android.permission.GET_ACCOUNTS"></uses-permission> 
    <uses-permission android:name="android.permission.USE_CREDENTIALS"></uses-permission> 
    <uses-permission android:name="android.permission.INTERNET"></uses-permission> 
    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".ZAuth02aActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity android:name=".AppInfo"></activity> 
    </application> 

</manifest> 

sử dụng file layout nick johnson rằng bạn có thể tải here

+0

Khi tôi thử điều này, tôi gặp lỗi getResult() không thể được chạy trên luồng chính từ dòng này: Bundle authTokenBundle = accountManagerFuture.getResult(); Tôi đang tìm cách giải thích lý do và cách giải quyết vấn đề này. –

0

Kiểm tra "auth" dự án mẫu trong Android SDK, nó chính xác điều đó.

Các vấn đề liên quan