标签: android-authenticator

Android:AccountPicker设置Light Theme

是否可以设置选择器对话框的主题?

import com.google.android.gms.common.AccountPicker;
....
String[] accountTypes = new String[]{"com.google"};
Intent intent = AccountPicker.newChooseAccountIntent(null, null,
                accountTypes, false, null, null, null, null);
activity.startActivityForResult(intent, REQUEST_CODE_PICK_ACCOUNT);
Run Code Online (Sandbox Code Playgroud)

我的基本应用主题是android:Theme.Light但对话框很暗.谢谢.

android android-theme google-authenticator android-authenticator google-play-services

8
推荐指数
1
解决办法
1222
查看次数

由 java.lang.SecurityException 引起:uid ... 无法显式添加类型的帐户:... Android P 和 Android 10

最近我看到 Firebase Crashlytic 在以下方面报告的错误有所增加

Caused by java.lang.SecurityException: uid 10172 cannot explicitly add accounts of type: com.mypackage.account
       at android.os.Parcel.createException(Parcel.java:2087)
       at android.os.Parcel.readException(Parcel.java:2055)
       at android.os.Parcel.readException(Parcel.java:2003)
       at android.accounts.IAccountManager$Stub$Proxy.addAccountExplicitly(IAccountManager.java:1660)
       at android.accounts.AccountManager.addAccountExplicitly(AccountManager.java:889)
Run Code Online (Sandbox Code Playgroud)

它是从

accountManager.addAccountExplicitly(defaultAccount, null, null)
Run Code Online (Sandbox Code Playgroud)

根据 Firebase Crashlytic 报告,它仅在 Android 9 和 10 以及三星、Realme 和 OPPO 设备上发生

最后,我尝试在 Android P 和 Android 10 设备上进行复制,并且代码没有问题地被触发。

我已经通过 StackOverflow 进行了搜索,例如

Android 应用程序在 addAccountExplicitly(account, password, null) 上崩溃;, Android SecurityException: uid xxxxx 无法显式添加账户, /sf/answers/4101384241/ , /sf/answers/2614423661/ , /sf/answers/1188043391/ /3286489Android 添加帐户与 AccountManager

它们用于可复制的问题,因此它对我没有用。

我检查也发现像

https://github.com/signalapp/Signal-Android/issues/9311 (Android …

android android-authenticator android-account

8
推荐指数
1
解决办法
627
查看次数

HttpUrlConnection在Android上找不到NTLM挑战

我正在尝试使用HttpUrlConnection类将我的Android应用程序连接到IIS服务器.

我的服务器需要用户进行身份验证,因此它向客户端发送以下质询:

WWW-Authenticate: Negotiate
WWW-Authenticate: NTLM
Run Code Online (Sandbox Code Playgroud)

我的问题是HttpUrlConnection似乎没有解析它.因此,getPasswordAuthentication()永远不会调用,并返回IOException"未发现身份验证质询".

这是我的代码:

Authenticator.setDefault(new Authenticator() {
    @Override
    protected PasswordAuthentication getPasswordAuthentication() {                  

            return new PasswordAuthentication("myUsername", "myPassword".toCharArray());
    }               
});

URL url = new URL(myUrl);               
HttpURLConnection conn = (HttpURLConnection) url.openConnection();          

conn.setRequestMethod("GET");
conn.setRequestProperty("Accept-Encoding", "gzip");
conn.setRequestProperty("Accept-Charset", "UTF-8");         
conn.setRequestProperty("Accept", "*/*");
conn.setRequestProperty("Connection", "close");
conn.setDoOutput(true);
conn.setDoInput(true);          

try 
{   
    conn.connect();             
    status_code = conn.getResponseCode();   
}catch (IOException e) {
    ...             
}
Run Code Online (Sandbox Code Playgroud)

我真的开始认为HttpUrlConnection不支持NTLM挑战.我看到一些图书馆似乎在做这项工作,但我不想使用外部库.

有人可以确认是否有可能在没有外部库的情况下使HttpUrlConnection处理NTLM挑战?

android ntlm httpurlconnection android-authenticator

7
推荐指数
1
解决办法
2484
查看次数

无法从不同的应用程序获取AuthToken的自定义帐户

我有两个使用相同帐户类型的应用.我希望当用户第一次打开第二个应用并且存在一个帐户时,会显示以下页面:

在此输入图像描述

但是当我运行这段代码时没有任何反应:

final AccountManagerFuture<Bundle> future = mAccountManager.getAuthToken(account, authTokenType, null, this, null, null);

new Thread(new Runnable() {
    @Override
    public void run() {
        try {
            Bundle bnd = future.getResult();

            final String authtoken = bnd.getString(AccountManager.KEY_AUTHTOKEN);
            showMessage((authtoken != null) ? "SUCCESS!\ntoken: " + authtoken : "FAIL");
            Log.d("udinic", "GetToken Bundle is " + bnd);
        } catch (Exception e) {
            e.printStackTrace();
            showMessage(e.getMessage());
        }
    }
}).start();
Run Code Online (Sandbox Code Playgroud)

当我从具有验证器的应用程序运行它时,上面的代码正常工作.当我在代码下面运行时,系统会生成一个通知,当我点击它时,会出现上面的图片.

final AccountManagerFuture<Bundle> future = mAccountManager
        .getAuthToken(account, authTokenType, null, true,
                null, handler);
Run Code Online (Sandbox Code Playgroud)

单击允许按钮可AuthToken正确返回.但是我希望在通话时看到授权许可页面(上图)getAuthToken,而不是点击通知.我怎样才能做到这一点?

android auth-token android-authenticator android-account

7
推荐指数
1
解决办法
738
查看次数

IllegalArgumentException:不支持addAccount

我按照此说明添加了我的同步适配器.

但是有一个小问题:-(

当我打开设置 - >帐户 - >添加帐户并选择我的帐户时,我收到此错误消息

java.lang.IllegalArgumentException: addAccount not supported
    at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2147)
    at android.accounts.AccountManager.-wrap0(AccountManager.java)
    at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:1993)
    at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:69)
    at android.os.Binder.execTransact(Binder.java:453)
Run Code Online (Sandbox Code Playgroud)

看起来这次崩溃来自将Authenticator Java类转换为Kotlin类.

Java类就像这样锁定

public class Authenticator extends AbstractAccountAuthenticator {

    private final Context mContext;

    // Simple constructor
    public Authenticator(Context context) {

        super(context);
        mContext = context;
    }

    // Editing properties is not supported
    @Override
    public Bundle editProperties(AccountAuthenticatorResponse response,
                                 String accountType) {

        throw new UnsupportedOperationException();
    }

    @Override
    public Bundle addAccount(AccountAuthenticatorResponse response, String accountType,
                             String authTokenType, String[] requiredFeatures, Bundle options) …
Run Code Online (Sandbox Code Playgroud)

android android-syncadapter kotlin android-authenticator

7
推荐指数
1
解决办法
1233
查看次数

UserRecoverableAuthUIException之前的GMail API授权权限

我按照Google的快速启动示例设置了GMail API:https://developers.google.com/gmail/api/quickstart/android

我的应用成功请求GET_ACCOUNTS权限,并允许用户选择他/她的Gmail帐户.所选帐户将保存在SharedPreferences中以供以后访问.

通过IntentService,我的应用程序会发送一封电子邮件.我按照此处的说明操作:https://developers.google.com/gmail/api/guides/sending,并根据需要包含activation.jar,additional.jar和mail.jar库.当我发送带有以下代码的电子邮件时,我得到一个UserRecoverableAuthUIException:

message = service.users().messages().send(userId, message).execute();
Run Code Online (Sandbox Code Playgroud)

当我捕获异常时,获取与异常一起存储的意图,并将意图作为新活动启动,我会看到一个对话框,让我有机会允许我的应用程序使用我的GMail帐户发送电子邮件:

UserRecoverableAuthIOException意图活动

在此对话框上按"允许"后,我的应用程序会发送电子邮件而不会出现任何其他问题.我的应用也会显示在我的Google帐户的在线权限页面上,表示它有权发送电子邮件.

当我第一次获取用户的帐户名而不是等待发生异常时,有没有办法手动触发此对话框?

UPDATE

我已经能够提取存储在intent中的动作和数据,如果这有助于任何:

  • 操作: com.google.android.gms.ui.UNPACKING_REDIRECT
  • 数据:意图://com.google.android.gms.auth.uiflows.common/KEY

其中KEY是一系列字符,可能链接到我的帐户或是一个令牌.

编辑:

以下是创建Credentials对象并启动我正在使用的帐户选择器活动的代码:

private GoogleAccountCredential mCredential;
private static final String[] SCOPES = { GmailScopes.GMAIL_COMPOSE };
Run Code Online (Sandbox Code Playgroud)

内部构造函数:

mCredential = GoogleAccountCredential.usingOAuth2(
                getApplicationContext(), Arrays.asList(SCOPES))
                .setBackOff(new ExponentialBackOff());
Run Code Online (Sandbox Code Playgroud)

我在哪里获得帐户:

private void chooseGMailAccount() {
        String accountName = this.getSharedPreferences(getString(R.string.shared_pref_main),
                Context.MODE_PRIVATE)
                .getString(getString(R.string.srd_pref_gmail_account), null);
        if (accountName != null) {
            mCredential.setSelectedAccountName(accountName);
            configureGMailAPI();
        } else {
            startActivityForResult(
                    mCredential.newChooseAccountIntent(),
                    REQUEST_ACCOUNT_PICKER);
        }
    }
Run Code Online (Sandbox Code Playgroud)

android android-authenticator google-oauth gmail-api android-googleapiclient

7
推荐指数
1
解决办法
987
查看次数

谁和什么时候应该调用基于AbstractAccountAuthenticator的类的方法confirmCredentials?

我不明白方法confirmCredentials是如何工作的.我从未在Android UI中看到任何类似"确认凭据"之类的选项,只有"创建帐户"和"删除帐户".

android android-authenticator android-account

6
推荐指数
1
解决办法
1384
查看次数

GitHub如何使用android app强制认证?

我正在挖掘GitHub android应用程序源代码.

我试图找出他们如何强制LoginActivity在应用程序首次启动时显示.在它们的清单中,它们似乎具有HomeActivityMAIN并且LoginActivity仅被明确地启动.

这意味着HomeActivity应用程序首次打开时始终会启动.但是,我没有看到HomeActivity中的任何逻辑表明他们检查帐户是否存在,如果它不存在则转到LoginActivity

在代码LoginActivity只从这里启动.

java android github android-authenticator

6
推荐指数
1
解决办法
881
查看次数

Android身份验证Mananger,何时需要用户权限?

我正在编写一个Android应用程序,我需要从该帐户请求一个Auth令牌.获取帐户列表和令牌很容易,我到目前为止工作.

问题是Jelly Bean打开一个弹出窗口,要求用户许可.现在我的问题:

  1. 弹出对话框出现的规则是什么?在将设备更新到Android 4.1之后,我第一次发生了这种情况.它似乎随机发生:安装和卸载应用程序我无法重现此弹出窗口返回的情况.
  2. 有没有办法在没有恢复出厂设置的情况下重置它?我需要重现这个以测试问题3.)
  3. 有没有办法找出弹出窗口是否会请求authtoken 之前出现,即等到它不再需要(例如,如果用户安装了相关的应用程序但从未使用过,或者authtoken是否已过期?)然后请求它?

    我知道大多数Android用户都非常缺乏经验,并且可能会因为一些权限请求而感到害怕,我想避免在触发此用户弹出窗口时请求authtoken.

java android access-token android-authenticator android-4.2-jelly-bean

5
推荐指数
1
解决办法
817
查看次数

通过带有指纹的android密钥库检索用户凭据(用户名和密码)

我正在构建一个Android应用程序,我需要使用指纹api通过用户名和密码(在备份上)对用户进行身份验证.

这是我用最简单的术语理解我需要做的事情.

  1. 在用户输入用户名和密码并使用后端成功验证后登录时,我生成并将具有这些凭据的特定密钥库存储到androidkeystore.

  2. 在下次登录时,如果用户通过指纹成功进行身份验证,则从android密钥库中检索凭据(用户名和密码),并使用这些凭据在后端对用户进行身份验证.

我已经关注:http: //www.techotopia.com/index.php/An_Android_Fingerprint_Authentication_Tutorial

这给出了如何使用指纹API通过设备对用户进行身份验证的一个很好的示例.但是如何获取凭据,以便我可以使用后端对用户进行身份验证?

我想做什么的步骤,建议或详细示例?

谢谢.

android android-authenticator android-keystore android-security android-fingerprint-api

5
推荐指数
1
解决办法
1992
查看次数