ila*_*sas 5 authentication android accountmanager access-token
我尝试在我的应用程序中实现一个帐户管理器,以避免用户每次打开应用程序时都必须登录.
所以基本上,我已经有了我的身份验证活动,用户可以在其中输入登录名和密码以及我们从服务器接收令牌的地方(此时身份验证是基本的).现在我想添加AccountManager,但我真的不明白哪个部分会去哪里.
我需要的是非常基本的:
这是我的代码:
AuthenticationActivity.java
public class AuthenticationActivity extends Activity {
private EditText editTextUsername;
private EditText editTextPassword;
private Button buttonLogin;
private ProgressBar spinner;
private TextView error;
private TextView register;
private boolean accountRegistred;
AccountManager accountManager;
public static final String AUTHENTICATION = "authentication"; //action
private ConnectionSuccessReceiver connectionSuccessReceiver = new ConnectionSuccessReceiver();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.authentification);
accountManager = AccountManager.get(this);
Account[] accounts = accountManager.getAccountsByType("login");
if (accounts.length > 0) {
//If there is an account
} else {
accountRegistred = false;
editTextUsername = (EditText) findViewById(R.id.editText_login);
editTextUsername.setVisibility(View.VISIBLE);
editTextPassword = (EditText) findViewById(R.id.editText_password);
editTextPassword.setVisibility(View.VISIBLE);
buttonLogin = (Button) findViewById(R.id.button_connection);
buttonLogin.setVisibility(View.VISIBLE);
error = (TextView) findViewById(R.id.textView_error);
register = (TextView) findViewById(R.id.textView_register);
register.setVisibility(View.VISIBLE);
spinner = (ProgressBar) findViewById(R.id.progressBar);
buttonLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//Here we start the service which will reach the server
Intent i = new Intent(getApplicationContext(), AuthenticationService.class);
i.putExtra("username", editTextUsername.getText().toString());
i.putExtra("password", editTextPassword.getText().toString());
getApplication().startService(i);
spinner.setVisibility(View.VISIBLE);
error.setVisibility(View.INVISIBLE);
}
});
register.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
startActivity(new Intent(AuthenticationActivity.this, RegisterActivity.class));
}
});
}
registerReceiver(connectionSuccessReceiver, new IntentFilter(AUTHENTICATION));
}
private class ConnectionSuccessReceiver extends BroadcastReceiver {
//Called when the server returns success after authentication, we get the TOKEN here
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getStringExtra("STATE").equals("CONNECTED")) {
Intent i = new Intent(AuthenticationActivity.this, MainActivity.class);
i.putExtra("TOKEN", intent.getStringExtra("TOKEN"));
startActivity(i);
} else {
spinner.setVisibility(View.INVISIBLE);
error.setVisibility(View.VISIBLE);
}
finish();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(connectionSuccessReceiver);
}
}
Run Code Online (Sandbox Code Playgroud)
AuthenticatorService.java
public class AuthenticatorService extends Service {
/**
* The implementation of the class |AccountAuthenticatorImpl|.
* It is implemented as a singleton
*/
private static AccountAuthenticator accountAuthenticator = null;
/**
* The main constructor.
*/
public AuthenticatorService() {
super();
}
/**
* The bind method of the service.
* @param intent The intent used to invoke the service
* @return The binder of the class which has implemented |AbstractAccountAuthenticator|
*/
@Override
public IBinder onBind(Intent intent) {
IBinder ret = null;
if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)) {
ret = getAuthenticator().getIBinder();
}
return ret;
}
/**
* The method used to obtain the authenticator. It is implemented as a singleton
* @return The implementation of the class |AbstractAccountAuthenticator|
*/
private AccountAuthenticator getAuthenticator() {
if (AuthenticatorService.accountAuthenticator == null) {
AuthenticatorService.accountAuthenticator = new AccountAuthenticator(this);
}
return AuthenticatorService.accountAuthenticator;
}
public class AccountAuthenticator extends AbstractAccountAuthenticator {
private Context context;
public AccountAuthenticator(Context context) {
super(context);
this.context = context;
}
@Override
public Bundle editProperties(AccountAuthenticatorResponse accountAuthenticatorResponse, String s) {
return null;
}
@Override
public Bundle addAccount(AccountAuthenticatorResponse response, String accountType, String authTokenType, String[] requiredFeatures, Bundle options) throws NetworkErrorException {
Bundle reply = new Bundle();
Intent i = new Intent(context, AuthenticationActivity.class);
i.setAction("com.readyo.app.authentication.addnewaccount");
i.putExtra(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE, response);
i.putExtra("AuthTokenType", authTokenType);
reply.putParcelable(AccountManager.KEY_INTENT, i);
return reply;
}
@Override
public Bundle confirmCredentials(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, Bundle bundle) throws NetworkErrorException {
return null;
}
@Override
public Bundle getAuthToken(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String s, Bundle bundle) throws NetworkErrorException {
return null;
}
@Override
public String getAuthTokenLabel(String s) {
return null;
}
@Override
public Bundle updateCredentials(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String s, Bundle bundle) throws NetworkErrorException {
return null;
}
@Override
public Bundle hasFeatures(AccountAuthenticatorResponse accountAuthenticatorResponse, Account account, String[] strings) throws NetworkErrorException {
return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
我还有通过HTTP到达服务器的代码,但我不确定它在这里是否重要.
感谢您的时间.
回复有点晚了,但也许这个示例可以帮助您: https: //github.com/dawidgdanski/AccountAuthenticatorExample
我前段时间创建了它,但注册/登录的逻辑可能会有所帮助
add an account if I never logged in before:
Run Code Online (Sandbox Code Playgroud)
验证并验证用户凭据后,调用 AccountManager.addAccountExcplicitly() 方法。
请记住,您也可以从系统设置创建应用程序特定的帐户。
log automatically if my account exists
Run Code Online (Sandbox Code Playgroud)
嗯,我不确定我是否正确理解了你的需求。将 Account 存储在 AccountManager 的元数据中后,调用 AccountManager.getAccountsByType("my.account.type") 即可使用该元数据。如果您想自动登录,那么您必须在某个地方存储您的凭据,这显然面临敏感数据泄露的威胁。
if the auto authentication doesn't work get a new token on the server
Run Code Online (Sandbox Code Playgroud)
有一个 AccountManager.invalidateAuthToken() 方法可以删除当前存储的 authToken 并调用另一个。
您可以启动示例应用程序,我认为它至少可以解决您的一些问题,因为它涵盖了以下逻辑:
干杯
| 归档时间: |
|
| 查看次数: |
4320 次 |
| 最近记录: |