How do you force AccountManager to show the "Access Request" screen after a user has already allowed access?
Asked Answered
M

4

15

When using AccountManager::getAuthTokenByFeatures, an Access Request screen is shown for the user to allow or deny access to the account. After a user allows access, subsequent calls (with the same arguments) return the auth token without prompting the user.

How do you clear the state to make sure the Access Request prompt appears? (This would useful at the very least for development, testing, and demo purposes.)

Married answered 27/7, 2011 at 23:1 Comment(0)
M
7

The only solution I've found is to manually clear out the data stored in the system's accounts.db. Run the following from the command line to clear out all account grants on the system.

For the emulator:

adb -e shell 'sqlite3 /data/system/accounts.db "delete from grants;"'

For a device (must be rooted and have the sqlite3 binary installed):

adb -d shell 'echo sqlite3 /data/system/accounts.db \"delete from grants\;\" | su'
Married answered 27/7, 2011 at 23:3 Comment(4)
eventually helpful note for others: you might need to make the system folder writable, if sqlite3 isn't already on the device, and you need to push it via adb. #6066530Shigella
Another hint: I needed to call "sqlite" with quotes, otherwise I got an error. See #13696759Shigella
Of interest for those still running in to this problem further on down the road: (1) on Android 4.2 which added multi-user support, the accounts.db file will be located in a subdirectory per user, e.g. /data/system/users/0/accounts.db (2) when I ran into the need to revoke these permissions, I found that the grants table in /data/system/users/0/accounts.db was empty. I was using the newer Google Play Services lib to get tokens, and it would appear it stores the grants somewhere else -- possibly even in the cloud (!).Paleopsychology
Ran into this same problem, eventually just had to settle for renaming the package each time I wanted to test out the Permission Request flow - pretty annoying that there isn't a better fix for this! Not even uninstalling worked for me.Cagliostro
P
1

I have created a new account which I use for testing. A new account will always prompt for Access Request. Remember to NOT allow access.

To test for the login screen, change the password for the account from another device/PC.

Pastoralize answered 17/5, 2012 at 19:9 Comment(0)
V
1

Using Google Play Services:

http://developer.android.com/reference/com/google/android/gms/auth/GoogleAuthUtil.html

Add https://www.googleapis.com/auth/userinfo.profile to your scope.

Example:

String scope="oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile"

final String token = GoogleAuthUtil.getToken(context, "[email protected]", scope);

OR "brute force"

Intent res = new Intent();
res.addCategory("account:[email protected]");
res.addCategory("scope:oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
res.putExtra("service", "oauth2:https://www.googleapis.com/auth/userinfo.email https://www.googleapis.com/auth/userinfo.profile");
Bundle extra= new Bundle();
extra.putString("androidPackageName","com.your.package");
res.putExtra("callerExtras",extra);
res.putExtra("androidPackageName","com.your.package");
res.putExtra("authAccount","[email protected]");

String mPackage = "com.google.android.gms";
String mClass = "com.google.android.gms.auth.TokenActivity";
res.setComponent(new ComponentName(mPackage,mClass));
startActivityForResult(res,100);

Now, when you revoke the access here https://accounts.google.com/IssuedAuthSubTokens the application shows you the window for permission again in the device.

Voodooism answered 14/8, 2013 at 21:24 Comment(0)
A
0

In my case what Benn Sandoval says does not work.

I had to revoke permissions programmatically and then connect again.

if (googleApiClient != null && !googleApiClient.isConnecting() && googleApiClient.isConnected()){

    googleApiClient.clearDefaultAccountAndReconnect();
    Plus.AccountApi.revokeAccessAndDisconnect(googleApiClient).setResultCallback(new ResultCallback<Status>() {
        @Override
        public void onResult(Status status) {
            Log.i("google+", "Google+ user access revoked");
            googleApiClient.connect();
        }
    });
}

Doing this i was getting asked again to grant permissions to google+

Arcboutant answered 16/7, 2015 at 12:55 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.