【发布时间】:2021-08-02 15:07:31
【问题描述】:
背景
对于我正在开发的应用程序,它使用 People API 并使用凭据(用户登录)。用户提供凭据后,我可以访问各种 Google API,例如 People API。一个示例是获取联系人列表:
https://developers.google.com/people/api/rest/v1/people.connections/list
我注意到 com.google.api.client.googleapis.auth.oauth2.GoogleCredential 类已被弃用:
问题
该应用的旧代码基于一些旧的 G+ 代码 (here),用于通过 Google 帐户联系联系人。这是其中最重要部分的 sn-p,这让我很难从它迁移出去:
object GoogleOuthHelper {
@WorkerThread
fun setUp(context: Context, serverAuthCode: String?): Services {
val httpTransport: HttpTransport = NetHttpTransport()
val jsonFactory = JacksonFactory.getDefaultInstance()
// Redirect URL for web based applications. Can be empty too.
val redirectUrl = "urn:ietf:wg:oauth:2.0:oob"
// Exchange auth code for access token
val tokenResponse = GoogleAuthorizationCodeTokenRequest(
httpTransport, jsonFactory, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET,
serverAuthCode, redirectUrl)
.execute()
// Then, create a GoogleCredential object using the tokens from GoogleTokenResponse
val credential = GoogleCredential.Builder()
.setClientSecrets(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET)
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.build()
val accessToken = tokenResponse.accessToken
getDefaultSecuredSharedPreferences(context).edit()
.putString(SecuredSharedPreferences.KEY__GOOGLE_ACCESS_TOKEN, accessToken).apply()
credential.setFromTokenResponse(tokenResponse)
val appPackageName = context.packageName
val peopleServiceApi = PeopleService.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(appPackageName)
.build()
val peopleService = peopleServiceApi.people()
val otherContactsService = peopleServiceApi.otherContacts()
val contactGroups = peopleServiceApi.contactGroups()
return Services(peopleService, otherContactsService, contactGroups)
}
class Services(
/**https://developers.google.com/people/api/rest/v1/people*/
val peopleService: PeopleService.People,
/**https://developers.google.com/people/api/rest/v1/otherContacts*/
val otherContactsService: OtherContacts,
/**https://developers.google.com/people/api/rest/v1/contactGroups*/
val contactGroups: ContactGroups)
}
问题甚至从一开始就存在:
GoogleCredentials 类似乎不接受我为 GoogleCredential 类提供的任何东西。
要添加更多内容,此函数将“serverAuthCode”作为参数,它来自GoogleSignInAccount,但要获取它,我需要使用已弃用的GoogleApiClient类:
fun prepareGoogleApiClient(someContext: Context): GoogleApiClient {
val context = someContext.applicationContext ?: someContext
val gso = GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestServerAuthCode(GOOGLE_CLIENT_ID)
.requestEmail()
.requestScopes(
Scope(PeopleServiceScopes.CONTACTS_READONLY),
Scope(PeopleServiceScopes.USERINFO_PROFILE),
Scope(PeopleServiceScopes.USER_EMAILS_READ),
Scope(PeopleServiceScopes.CONTACTS),
Scope(PeopleServiceScopes.CONTACTS_OTHER_READONLY)
)
.build()
return GoogleApiClient.Builder(context)
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build()
}
这就是我用它做的:
val connectionResult = googleApiClient!!.blockingConnect()
if (!connectionResult.isSuccess)
return
val operation = Auth.GoogleSignInApi.silentSignIn(googleApiClient)
val googleSignInResult: GoogleSignInResult = operation.await()
val googleSignInAccount = googleSignInResult.signInAccount
//use googleSignInAccount.serverAuthCode in setUp() function above
Gradle 文件具有以下依赖项:
// https://mvnrepository.com/artifact/com.google.auth/google-auth-library-oauth2-http
implementation 'com.google.auth:google-auth-library-oauth2-http:0.26.0'
// https://github.com/googleapis/google-api-java-client-services/tree/master/clients/google-api-services-people/v1#gradle https://mvnrepository.com/artifact/com.google.apis/google-api-services-people
implementation 'com.google.apis:google-api-services-people:v1-rev20210515-1.31.0'
我尝试过的
除了查看文档(并且没有看到与我必须处理的相似之处)之外,我尝试在这里写下这个。
遗憾的是,我还没有找到摆脱旧代码的方法。
我试图在那里询问如何迁移(here 和 here),但还没有得到答案。
问题
如何在仍使用 People API 等各种 API 的同时从 GoogleCredential 迁移到 GoogleCredentials?
换句话说:如何避免在 Android 上使用这些已弃用的类(GoogleCredential 和 GoogleApiClient),同时仍然能够使用各种 API?
【问题讨论】:
-
我发现有关 Google 凭据的文档相当不透明。我试图了解您在寻找什么。您是否尝试在不让用户再次登录的情况下迁移到 GoogleCredentials?或者您是否正在寻找如何将 GoogleCredentials 与各种 API 一起使用的示例?还是别的什么?
-
我编写的代码用于访问 Google People API,例如获取 Google 联系人中的联系人列表:developers.google.com/people/api/rest/v1/people.connections/…。它需要登录,这是有道理的。我正在尝试找到如何从已弃用的代码(我在这里至少展示了 2 个已弃用的地方)迁移到新的代码。我会更新问题。
-
你能发布应用程序的 build.gradle 文件吗?我有兴趣知道您从哪里拉 PeopleService.Builder()?我问是因为我认为争论可能发生了变化,但我不确定。我只是想证实我的怀疑。
-
也许它与旧的 G+ 代码相关联,但您是否还需要使用 GoogleCredentials?查看 REST API 示例的 Google signin quickstart 特别是 this line。在那里,GoogleAccountCredential 用于凭据,这是我一直在使用的。也许我错过了什么。
-
@Cheticamp 更新问题以保存相关依赖项。旧的 G+ 代码只是一切的起点。它随着时间而改变。我现在已经将代码更新为它所更改的内容。我不明白如何使用你发给我的东西。你试过了吗?你说登录程序本身也要改?我看到它有
Account作为参数,但我有的是GoogleSignInAccount(不扩展它)。
标签: java android oauth-2.0 google-api google-people-api