android - एंड्रॉइड लॉगिन-खाता प्रमाणीकरण बनाम मैनुअल प्रमाणीकरण




authentication login (2)

मैं अपने ऐप में उपयोगकर्ता प्रमाणीकरण के साथ लॉगिन लागू करने जा रहा हूं।

मेरा पहला विचार मैन्युअल रूप से करना था, सर्वर के साथ उपयोगकर्ता नाम और पासवर्ड पंजीकृत करना, ऑथ टोकन प्राप्त करना, इसे सहेजना और बाद के अनुरोधों में इसका उपयोग करना था।

चारों ओर घूमने के बाद, मैंने इकट्ठा किया कि एंड्रॉइड पर ऐसा करने का सही तरीका खाता प्रमाणीकरणकर्ता का उपयोग कर रहा था। मैंने इसके कार्यान्वयन के कुछ उदाहरण देखे हैं लेकिन मुझे ऐसा करने का लाभ समझ में नहीं आता है? क्या ऐसा इसलिए है क्योंकि मेरे पास एक से अधिक खाते संग्रहीत हो सकते हैं? क्या यह मुद्दों को सुलझाने की वजह से है? अगर कोई मुझे यह समझा सकता है तो मैं सराहना करता हूं। यह शायद मुझे इसके लिए कोड को बेहतर समझ देगा और यह क्यों कर रहा है।


मेरे पास एक से अधिक खाते संग्रहीत हो सकते हैं?

हाँ। देखें कि Google या फेसबुक कैसे करते हैं।

क्या यह मुद्दों को सुलझाने की वजह से है?

हां, आपको सिंक्रनाइज़ेशन तंत्र जैसे SyncAdapter का उपयोग करने के लिए खाता चाहिए

आपको AccountAuthenticator उपयोग क्यों करना चाहिए?

  • SyncAdapter जैसे पृष्ठभूमि सिंक्रनाइज़ेशन तंत्र का समर्थन;

  • उपयोगकर्ताओं को प्रमाणीकृत करने का मानक तरीका;

  • विभिन्न टोकन का समर्थन करें;

  • विभिन्न विशेषाधिकारों के साथ खाता साझा करना

तुम्हें क्या करने की ज़रूरत है?

1)। Authenticator बनाएँ;

2)। उपयोगकर्ता लॉगिन के लिए Activity बनाएँ;

3)। खाते के साथ संवाद करने के लिए Service बनाएँ।

नियम।

खाता AccountManager - यह डिवाइस पर खाता प्रबंधित करता है। AccountManager का उपयोग करने वाले AccountManager टोकन का अनुरोध करें।

AbstractAccountAuthenticator अकाउंट AbstractAccountAuthenticator - खाता प्रकारों के साथ काम करने के लिए घटक। इसमें खाते (प्राधिकरण, अभिगम अधिकार इत्यादि) के साथ काम करने के लिए सभी तर्क शामिल हैं। एक AbstractAccountAuthenticator अकाउंट प्रमाणीकरणकर्ता का उपयोग विभिन्न एप्लिकेशन (जैसे जीमेल, कैलेंडर, ड्राइव इत्यादि के लिए Google खाते) द्वारा किया जा सकता है।

AccountAuthenticatorActivity प्रमाणीकरण Activity - आधार Activity , प्राधिकृत / खाता बनाने के लिए। खाता AccountManager यह खाता कॉल करता है यदि खाता पहचानना आवश्यक है (टोकन मौजूद नहीं है या समाप्त हो गया है)

यह सब कैसे काम करता है? नीचे दी गई छवि को देखें:

कदम।

1)। Authenticator बनाएँ;

आपको AbstractAccountAuthenticator का विस्तार करने और 7 विधियों को ओवरराइड करने की आवश्यकता है:

  • Bundle editProperties(AccountAuthenticatorResponse response, String accountType) link
  • Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) link
  • Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) link
  • Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) link
  • String getAuthTokenLabel(String authTokenType) link
  • Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) link
  • Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) link

उदाहरण:

public class LodossAuthenticator extends AbstractAccountAuthenticator {

    private static final String LOG_TAG = LodossAuthenticator.class.getSimpleName();

    private final Context mContext;

    public LodossAuthenticator(Context context) {
        super(context);
        mContext = context;
    }

    @Override
    public Bundle editProperties(AccountAuthenticatorResponse response, String accountType) {
        return null;
    }

    @Override
    public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {
        final Intent intent = new Intent(mContext, CustomServerAuthenticatorSigninActivity.class);
        intent.putExtra(Config.ARG_ACCOUNT_TYPE, accountType);
        intent.putExtra(Config.ARG_AUTH_TYPE, authTokenType);
        intent.putExtra(Config.ARG_IS_ADDING_NEW_ACCOUNT, true);
        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);

        final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
    }

    @Override
    public Bundle confirmCredentials(AccountAuthenticatorResponse response, Account account, Bundle options) throws NetworkErrorException {
        return null;
    }

    @Override
    public Bundle getAuthToken(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
        // If the caller requested an authToken type we don't support, then
        // return an error
        if (!authTokenType.equals(AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY) && !authTokenType.equals(AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS)) {
            final Bundle result = new Bundle();
            result.putString(AccountManager.KEY_ERROR_MESSAGE, "invalid authTokenType");
            return result;
        }

        // Extract the username and password from the Account Manager, and ask
        // the server for an appropriate AuthToken.
        final AccountManager am = AccountManager.get(mContext);
        String authToken = am.peekAuthToken(account, authTokenType);

        // Lets give another try to authenticate the user
        if (TextUtils.isEmpty(authToken)) {
            final String password = am.getPassword(account);
            if (password != null) {
                try {
                    authToken = sServerAuthenticate.userSignIn(account.name, password, authTokenType);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }

        // If we get an authToken - we return it
        if (!TextUtils.isEmpty(authToken)) {
            final Bundle result = new Bundle();
            result.putString(AccountManager.KEY_ACCOUNT_NAME, account.name);
            result.putString(AccountManager.KEY_ACCOUNT_TYPE, account.type);
            result.putString(AccountManager.KEY_AUTHTOKEN, authToken);
            return result;
        }

        // If we get here, then we couldn't access the user's password - so we
        // need to re-prompt them for their credentials. We do that by creating
        // an intent to display our AuthenticatorActivity.
        final Intent intent = new Intent(mContext, AuthenticatorActivity.class);
        intent.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
        intent.putExtra(com.lodoss.authlib.Config.ARG_ACCOUNT_TYPE, account.type);
        intent.putExtra(com.lodoss.authlib.Config.ARG_AUTH_TYPE, authTokenType);
        intent.putExtra(Config.ARG_ACCOUNT_NAME, account.name);
        final Bundle bundle = new Bundle();
    bundle.putParcelable(AccountManager.KEY_INTENT, intent);
    return bundle;
    }

    @Override
    public String getAuthTokenLabel(String authTokenType) {
        if (AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS.equals(authTokenType))
            return AccountGeneral.AUTHTOKEN_TYPE_FULL_ACCESS_LABEL;
        else if (AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY.equals(authTokenType))
            return AccountGeneral.AUTHTOKEN_TYPE_READ_ONLY_LABEL;
        else
            return authTokenType + " (Label)";
    }

    @Override
    public Bundle updateCredentials(AccountAuthenticatorResponse response, Account account, String authTokenType, Bundle options) throws NetworkErrorException {
        return null;
    }

    @Override
    public Bundle hasFeatures(AccountAuthenticatorResponse response, Account account, String[] features) throws NetworkErrorException {
        final Bundle result = new Bundle();
        result.putBoolean(KEY_BOOLEAN_RESULT, false);
        return result;
    }
}

स्पष्टीकरण:

तो, आपको केवल 2 विधियों को देखने की आवश्यकता है: addAccount , getAuthToken

addAccount मैंने कुछ कॉन्फ़िगरेशन addAccount जोड़े हैं, जिनका उपयोग यूजर लॉग इन के लिए मेरी Activity द्वारा किया जाएगा। यहां मुख्य बिंदु intent.putExtra(Config.ARG_ACCOUNT_TYPE, accountType); है intent.putExtra(Config.ARG_ACCOUNT_TYPE, accountType); - आपको यहां खाता प्रकार निर्दिष्ट करना चाहिए। अन्य कुशलता जरूरी नहीं है।

getAuthToken - कृपया टिप्पणियां पढ़ें । मैंने UdinicAuthenticator.java से इस विधि को कॉपी-पेस्ट किया है

साथ ही, आपको अपने AndroidManifest.xml में निम्न अनुमतियों की आवश्यकता होगी:

<uses-permission android:name="android.permission.GET_ACCOUNTS" />
<uses-permission android:name="android.permission.MANAGE_ACCOUNTS" />
<uses-permission android:name="android.permission.AUTHENTICATE_ACCOUNTS" />
<uses-permission android:name="android.permission.USE_CREDENTIALS" />

तरीकों से सारांश addAccount और getAuthToken

टोकन प्राप्त करने का प्रयास करें, यदि टोकन रिटर्न परिणाम मौजूद है, तो आप प्राधिकरण के लिए Activity देखेंगे

2)। उपयोगकर्ता लॉगिन के लिए Activity बनाएँ;

AuthenticatorActivity देखें

संक्षिप्त स्पष्टीकरण: उपयोगकर्ता आईडी और पासवर्ड के साथ फॉर्म बनाएं। UserId और पासवर्ड डेटा का उपयोग सर्वर से ऑथ टोकन प्राप्त करें और फिर निम्न चरण निष्पादित करें:

mAccountManager.addAccountExplicitly(account, accountPassword, null);
mAccountManager.setAuthToken(account, authtokenType, authtoken);

3)। खाते के साथ संवाद करने के लिए एक Service बनाएँ।

UdinicAuthenticatorService देखें

Service में AndroidManifest.xml में इस पंक्ति को जोड़ने के लिए मत भूलना:

    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator"
               android:resource="@xml/authenticator" />

और res/xml में फ़ाइल authenticator.xml भी जोड़ें:

<?xml version="1.0" encoding="utf-8"?>
<account-authenticator xmlns:android="http://schemas.android.com/apk/res/android"
                       android:accountType="com.mediamanagment.app"
                       android:icon="@drawable/ic_launcher"
                       android:smallIcon="@drawable/ic_launcher"
                       android:label="@string/authenticator_label"/>

बस इतना ही। आप अपने AccountAuthenticator उपयोग कर सकते हैं।

स्रोत सामग्री के लिए धन्यवाद


एंड्रॉइड की सेटिंग्स में आपके खाते के प्रकार के लिए खाते हैं और वहां से आप एक खाता जोड़ सकते हैं। AccountManager भी क्रेडेंशियल स्टोर करने के लिए एक केंद्रीय स्थान है ताकि आप प्रत्येक विक्रेता के लिए केवल एक बार साइन इन कर सकें। यदि आप एक और Google ऐप डाउनलोड करते हैं या ऐप को कई बार एक्सेस करते हैं तो आप केवल एक बार क्रेडेंशियल्स दर्ज करते हैं





accountmanager