我已经构建了一个Authenticator,我已经构建了一个SyncAdapter(两者都可以通过模拟器上的设置手动执行).
如果没有找到帐户,如何在应用程序启动时让我的应用程序启动登录屏幕(addAccount方法)?
这是我的Manifest.xml ...
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lateral.myapp"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="8" android:targetSdkVersion="14"/>
<uses-permission android:name="android.permission.INTERNET"/>
<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"/>
<uses-permission android:name="android.permission.READ_SYNC_STATS" />
<uses-permission android:name="android.permission.READ_SYNC_SETTINGS" />
<uses-permission android:name="android.permission.WRITE_SYNC_SETTINGS" />
<application android:icon="@drawable/icon" android:label="@string/app_name" android:name=".myappApplication">
<activity android:name=".ui.EventListActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>
<service android:name=".authenticator.AccountAuthenticatorService" android:exported="true" android:process=":auth">
<intent-filter>
<action android:name="android.accounts.AccountAuthenticator"/>
</intent-filter>
<meta-data android:name="android.accounts.AccountAuthenticator" android:resource="@xml/authenticator"/>
</service>
<service android:name="sync.EventsSyncAdapterService" android:exported="true" android:process=":events">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter" android:resource="@xml/sync_events" />
</service>
<activity android:excludeFromRecents="true" android:name=".authenticator.myappAuthenticatorActivity">
<!--
No intent-filter …Run Code Online (Sandbox Code Playgroud) 我有一个我为使用自定义AccountAuthenticator的客户端构建的应用程序.它工作得非常好,它可以满足客户的需求.
但是,这只是将使用相同身份验证管理器的应用程序集合中的第一个应用程序,这是我不确定如何继续的地方.
我无法知道任何给定用户将安装哪些应用程序,或者他们可能安装的顺序.我不要求用户为每个应用程序提供凭据; 这违背了拥有身份验证管理器的目的.
从一些初步测试看来,在每个应用程序中包含相同的代码似乎不起作用.
我应该做一些像使用任何谷歌播放服务所需的东西吗?编写一个函数来测试是否存在只执行身份验证的应用程序,然后将用户发送到市场以安装执行身份验证的应用程序?或者从我们自己的服务器下载apk?
或者是否有其他方法可以避免将用户推出应用程序?
我想在访问令牌过期时刷新它。我已经实现了 Authenticator,如下所示:
@Singleton
class TokenAuthenticator(
val authService: Lazy<AuthService>,
private val sharedPreferences: SharedPreferences
) : Authenticator {
override fun authenticate(route: Route?, response: Response): Request? {
return authRequestWithNewToken(response.request)
}
private fun authRequestWithNewToken(
request: Request
): Request? {
getFreshAccessToken()?.let { freshToken ->
return getNewRequest(request, freshToken)
}
return null
}
private fun getFreshAccessToken(): String? {
val refreshResponse = authService.get().refreshTokenTemp().execute()
if (refreshResponse.isSuccessful) {
val updatedAccessToken =
refreshResponse.body()?.data?.accessToken ?: return null
val updatedRefreshToken =
refreshResponse.body()?.data?.refreshToken ?: return null
updateToken(updatedAccessToken, updatedRefreshToken)
Timber.tag("TOKEN")
.d("Auth Updated token\n AccessToken: $updatedAccessToken …Run Code Online (Sandbox Code Playgroud) 我有一个Google接受的有效OAuth2令牌,但GoogleIdTokenVerifier甚至无法解析它.
令牌是ya29.1.AADtN_XcjzHgauKetBvrbgHImGFg1pjiHRQAKHyTglBDjEZsTPUMQJ5p-xAKtk955_4r6MdnTe3HZ08(不用担心,它已经过期).
它是在Android上使用获得的
accountManager.blockingGetAuthToken(account, "oauth2:https://www.googleapis.com/auth/userinfo.email", true);
Run Code Online (Sandbox Code Playgroud)
当我打电话给https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=...
我时,我得到了理智的结果
{
"issued_to": "34951113407.apps.googleusercontent.com",
"audience": "34951113407.apps.googleusercontent.com",
"scope": "https://www.googleapis.com/auth/userinfo.email",
"expires_in": 3175,
"email": "me@gmail.com",
"verified_email": true,
"access_type": "offline"
}
Run Code Online (Sandbox Code Playgroud)
所以它必须是有效的令牌.但是当我打电话时
new GoogleIdTokenVerifier(new UrlFetchTransport(), JacksonFactory.getDefaultInstance())
.verify(authToken)
Run Code Online (Sandbox Code Playgroud)
它给了我
com.fasterxml.jackson.core.JsonParseException: Unexpected character ('É' (code 201)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')
at [Source: java.io.ByteArrayInputStream@69886979; line: 1, column: 2]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._handleUnexpectedValue(UTF8StreamJsonParser.java:2275)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._nextTokenNotInObject(UTF8StreamJsonParser.java:788)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:674)
at com.google.api.client.json.jackson2.JacksonParser.nextToken(JacksonParser.java:55)
at com.google.api.client.json.JsonParser.startParsing(JsonParser.java:213)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:372)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:328)
at …Run Code Online (Sandbox Code Playgroud) google-api oauth-2.0 google-api-java-client android-authenticator
我有一个自定义身份验证器,我想将用户/密码暴露给其他应用程序.为了防止任何随机应用程序获取凭据,我想在我的自定义身份验证器的getAuthToken()方法中执行类似权限检查的操作.什么是正确的方法?
我试过这个,
int p = context.checkCallingPermission("com.whatever.AUTH");
if (p != PackageManager.PERMISSION_GRANTED) {
Run Code Online (Sandbox Code Playgroud)
其中"com.whatever.AUTH"在托管我的身份验证器的应用程序中定义,
<permission android:name="com.vmware.horizon.AUTH" />
Run Code Online (Sandbox Code Playgroud)
但是,在我的测试应用程序中uses-permission,当我请求帐户时,它没有显示在其中,
AccountManagerFuture<Bundle> future = am.getAuthToken(new Account(
"com.whatever", "com.whatever"),
"com.whatever", new Bundle(), this,
new AccountManagerCallback<Bundle>() {
@Override
public void run(AccountManagerFuture<Bundle> future) {
String token = result.getString(AccountManager.KEY_AUTHTOKEN);
}
}, handler);
Run Code Online (Sandbox Code Playgroud)
我成功获得了身份验证令牌.调试显示调用通过我的身份验证器的getAuthToken()方法,但检查权限调用返回"已授予".
编辑:如果我从上下文中获取包名称我正在调用checkCallingPermission()它是托管自定义身份验证器的应用程序的包名称.如果我得到调用PID,UID分别为0和1000.
有任何想法吗?
我正在按照教程制作验证器:http://blog.udinic.com/2013/04/24/write-your-own-android-authenticator/
登录Activity需要扩展AccountAuthenticatorActivity,问题从这里开始:AccountAuthenticatorActivity扩展常规Activity而不是AppCompatActivity.
Activity在AppCompat中使用常规会导致Activity无ActionBar.我想使用AccountAuthenticatorActivity和有一个ActionBar.
android android-appcompat android-authenticator android-support-library appcompatactivity
我希望我的应用程序能够通过Facebook或Twitter或Gmail登录.我的应用程序不会在相应的帐户上发布,只是我的应用程序的授权或用户创建方式.
有没有任何简单的库可以实现这一点,没有SDK或复杂的配置.
任何建议或示例都会非常有用.
android android-twitter android-authenticator android-facebook