如何使用FirebaseAuth从Google提供商获取性别和生日? [英] How to get gender and birthday from Google provider using FirebaseAuth?
问题描述
我正在尝试使用Firebase AuthUI从Google提供商获取性别和生日。这里是我的代码。
pre $ AuthUI.IdpConfig googleIdp = new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER)
。 setPermissions(Arrays.asList(Scopes.EMAIL,Scopes.PROFILE,Scopes.PLUS_ME))
.build();
startActivityForResult(
AuthUI.getInstance()。createSignInIntentBuilder()
.setLogo(R.drawable.firebase_auth_120dp)
.setProviders(Arrays.asList(
新的AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
googleIdp))
.setIsSmartLockEnabled(false)
.setTheme(R.style.AppTheme_Login)
.build(),
RC_SIGN_IN);
在onActivityResult中:
IdpResponse idpResponse = IdpResponse.fromResultIntent(data);
我得到了 idpResponse
idpSecret
和 idpToken
。如何访问其他请求的字段,如性别和生日等个人资料?我可以使用
FirebaseAuth.getInstance()。getCurrentUser();来访问公共领域的电子邮件,姓名,照片等。
Firebase不支持该功能,但您可以通过这样:
首先你需要 client_id 和 client_secret 。
您可以通过以下步骤从Firebase面板获取这两个文件:
身份验证 >> 登录方法 STRONG>。点击 Google 并展开 Web SDK配置。
compile'com.google.apis:google-api-services-people:v1-rev63-1.22.0'
在您的登录活动中添加以下方法:
private void setupGoogleAdditionalDetailsLogin(){
//配置登录以请求用户的ID,电子邮件地址和基本配置文件。 ID和
//基本配置文件包含在DEFAULT_SIGN_IN中。
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(GOOGLE_CLIENT_ID)
.requestServerAuthCode(GOOGLE_CLIENT_ID)
.requestScopes(new范围(配置文件))
.build();
//建立一个可以访问GoogleSignIn.API和上述选项的GoogleApiClient。
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this,new GoogleApiClient.OnConnectionFailedListener(){
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult){ b $ b Log.d(TAG,onConnectionFailed:);
}
})
.addApi(Auth.GOOGLE_SIGN_IN_API,gso)
.build();
$ b $ public void googleAdditionalDetailsResult(意图数据){
Log.d(TAG,googleAdditionalDetailsResult:);
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if(result.isSuccess()){
//成功登录
GoogleSignInAccount acct = result.getSignInAccount();
//执行AsyncTask从Google People API获取数据
GoogleAdditionalDetailsTask()。execute(acct);
} else {
Log.d(TAG,googleAdditionalDetailsResult:fail);
startHomeActivity();
$ b $ private void startGoogleAdditionalRequest(){
意图signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent,RC_SIGN_GOOGLE);
$ / code $ / pre
$ b $异步任务获取更多详细信息
public class GoogleAdditionalDetailsTask extends AsyncTask< GoogleSignInAccount,Void,Person> {
@Override
受保护的人员doInBackground(GoogleSignInAccount ... googleSignInAccounts){
Person profile = null;
尝试{
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();
//为基于Web的应用程序重定向URL。
//也可以为空。
String redirectUrl =urn:ietf:wg:oauth:2.0:oob;
//访问令牌的交换授权码
GoogleTokenResponse tokenResponse =新的GoogleAuthorizationCodeTokenRequest(
httpTransport,
jsonFactory,
GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET,
googleSignInAccounts [0] .getServerAuthCode(),
redirectUrl $ b $).execute();
GoogleCredential凭证=新的GoogleCredential.Builder()
.setClientSecrets(GOOGLE_CLIENT_ID,GOOGLE_CLIENT_SECRET)
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
。建立();
credential.setFromTokenResponse(tokenResponse);
People peopleService = new People.Builder(httpTransport,jsonFactory,凭证)
.setApplicationName(App.getInstance()。getString(R.string.app_name))
.build ();
$ b $ //获取用户资料
profile = peopleService.people()。get(people / me)。execute();
} catch(IOException e){
Log.d(TAG,doInBackground:+ e.getMessage());
e.printStackTrace();
}
返回配置文件; (person!){
}
$ b @覆盖
保护无效onPostExecute(Person person){
if(person!= null){
if(person.getGenders() != null&& person.getGenders()。size()> 0){
profileGender = person.getGenders()。get(0).getValue(); ($ person $ getBirthdays()!= null&&person; getBirthdays()。get(0).size()> 0){
// $ y $ yy- MM-dd
Date dobDate = person.getBirthdays()。get(0).getDate();
if(dobDate.getYear()!= null){
profileBirthday = dobDate.getYear()+ - + dobDate.getMonth()+ - + dobDate.getDay();
profileYearOfBirth = DateHelper.getYearFromGoogleDate(profileBirthday); (person.getBiographies()!= null&& person.getBiographies()。size()> 0){
profileAbout = person。
if 。getBiographies()得到(0).getValue(); (person.getCoverPhotos()!= null&& person.getCoverPhotos()。size()> 0){
profileCover = person.getCoverPhotos()。get(
)
get (0).getUrl();
Log.d(TAG,String.format(googleOnComplete:gender:%s,birthday:%s,about:%s,cover:%s),profileGender,profileBirthday,profileAbout,profileCover ));
}
startHomeActivity();
改变你的onActivityResult像这样:
@Override
protected void onActivityResult(int requestCode,int resultCode,Intent data){
super.onActivityResult(requestCode,resultCode ,数据);
if(requestCode == RC_SIGN_GOOGLE){//添加明细请求的结果
googleAdditionalDetailsResult(data);
return;
} else if(requestCode == RC_SIGN_IN&& resultCode == RESULT_OK){//使用firebase
登录if(FirebaseAuth.getInstance()。getCurrentUser()。getProviders()。get 0).equals(google.com)){
//用户使用firebase使用Google帐户登录ui
startGoogleAdditionalRequest();
} else {
//用户用google
startHomeActivity();
} else {
//处理错误
}
}
更新:如果代码给出错误
lockquote
personFields掩码是必需的
$ b
然后使用以下代码:
pre $ $ $ $ $ profile = peopleService.people()。get(people / me)。 setRequestMaskIncludeField( person.names,person.emailAddress ES,person.genders,PE rson.birthdays)EXE可爱();
感谢@AbrahamGharyali。
I'm trying to get the gender and birthday from the Google provider using Firebase AuthUI. Here is my code.
AuthUI.IdpConfig googleIdp = new AuthUI.IdpConfig.Builder(AuthUI.GOOGLE_PROVIDER)
.setPermissions(Arrays.asList(Scopes.EMAIL, Scopes.PROFILE, Scopes.PLUS_ME))
.build();
startActivityForResult(
AuthUI.getInstance().createSignInIntentBuilder()
.setLogo(R.drawable.firebase_auth_120dp)
.setProviders(Arrays.asList(
new AuthUI.IdpConfig.Builder(AuthUI.EMAIL_PROVIDER).build(),
googleIdp))
.setIsSmartLockEnabled(false)
.setTheme(R.style.AppTheme_Login)
.build(),
RC_SIGN_IN);
In onActivityResult:
IdpResponse idpResponse = IdpResponse.fromResultIntent(data);
I got idpResponse
, but it only included idpSecret
and idpToken
. How can I access other requested fields for profile like gender and birthday? I can access common fields email, name, photo etc with
FirebaseAuth.getInstance().getCurrentUser();
解决方案 Firebase does not support that but you can do that by this way:
First you needed client_id and client_secret.
You can get these two from Firebase panel by following steps:
Authentication >> SIGN-IN METHOD. Click Google and expand Web SDK Configuration.
Gradle dependencies:
compile 'com.google.apis:google-api-services-people:v1-rev63-1.22.0'
Add following methods in your login activity.
private void setupGoogleAdditionalDetailsLogin() {
// Configure sign-in to request the user's ID, email address, and basic profile. ID and
// basic profile are included in DEFAULT_SIGN_IN.
GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
.requestEmail()
.requestIdToken(GOOGLE_CLIENT_ID)
.requestServerAuthCode(GOOGLE_CLIENT_ID)
.requestScopes(new Scope("profile"))
.build();
// Build a GoogleApiClient with access to GoogleSignIn.API and the options above.
mGoogleApiClient = new GoogleApiClient.Builder(this)
.enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
@Override
public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
Log.d(TAG, "onConnectionFailed: ");
}
})
.addApi(Auth.GOOGLE_SIGN_IN_API, gso)
.build();
}
public void googleAdditionalDetailsResult(Intent data) {
Log.d(TAG, "googleAdditionalDetailsResult: ");
GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
if (result.isSuccess()) {
// Signed in successfully
GoogleSignInAccount acct = result.getSignInAccount();
// execute AsyncTask to get data from Google People API
new GoogleAdditionalDetailsTask().execute(acct);
} else {
Log.d(TAG, "googleAdditionalDetailsResult: fail");
startHomeActivity();
}
}
private void startGoogleAdditionalRequest() {
Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
startActivityForResult(signInIntent, RC_SIGN_GOOGLE);
}
Async task to get additional details
public class GoogleAdditionalDetailsTask extends AsyncTask<GoogleSignInAccount, Void, Person> {
@Override
protected Person doInBackground(GoogleSignInAccount... googleSignInAccounts) {
Person profile = null;
try {
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = JacksonFactory.getDefaultInstance();
//Redirect URL for web based applications.
// Can be empty too.
String redirectUrl = "urn:ietf:wg:oauth:2.0:oob";
// Exchange auth code for access token
GoogleTokenResponse tokenResponse = new GoogleAuthorizationCodeTokenRequest(
httpTransport,
jsonFactory,
GOOGLE_CLIENT_ID,
GOOGLE_CLIENT_SECRET,
googleSignInAccounts[0].getServerAuthCode(),
redirectUrl
).execute();
GoogleCredential credential = new GoogleCredential.Builder()
.setClientSecrets(GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET)
.setTransport(httpTransport)
.setJsonFactory(jsonFactory)
.build();
credential.setFromTokenResponse(tokenResponse);
People peopleService = new People.Builder(httpTransport, jsonFactory, credential)
.setApplicationName(App.getInstance().getString(R.string.app_name))
.build();
// Get the user's profile
profile = peopleService.people().get("people/me").execute();
} catch (IOException e) {
Log.d(TAG, "doInBackground: " + e.getMessage());
e.printStackTrace();
}
return profile;
}
@Override
protected void onPostExecute(Person person) {
if (person != null) {
if (person.getGenders() != null && person.getGenders().size() > 0) {
profileGender = person.getGenders().get(0).getValue();
}
if (person.getBirthdays() != null && person.getBirthdays().get(0).size() > 0) {
// yyyy-MM-dd
Date dobDate = person.getBirthdays().get(0).getDate();
if (dobDate.getYear() != null) {
profileBirthday = dobDate.getYear() + "-" + dobDate.getMonth() + "-" + dobDate.getDay();
profileYearOfBirth = DateHelper.getYearFromGoogleDate(profileBirthday);
}
}
if (person.getBiographies() != null && person.getBiographies().size() > 0) {
profileAbout = person.getBiographies().get(0).getValue();
}
if (person.getCoverPhotos() != null && person.getCoverPhotos().size() > 0) {
profileCover = person.getCoverPhotos().get(0).getUrl();
}
Log.d(TAG, String.format("googleOnComplete: gender: %s, birthday: %s, about: %s, cover: %s", profileGender, profileBirthday, profileAbout, profileCover));
}
startHomeActivity();
}
}
Change you onActivityResult like this:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == RC_SIGN_GOOGLE) { // result for addition details request
googleAdditionalDetailsResult(data);
return;
} else if (requestCode == RC_SIGN_IN && resultCode == RESULT_OK) { //logged in with firebase
if (FirebaseAuth.getInstance().getCurrentUser().getProviders().get(0).equals("google.com")) {
// user logged in with google account using firebase ui
startGoogleAdditionalRequest();
} else {
// user logged in with google
startHomeActivity();
}
} else {
// handle error
}
}
Update: if code gives error
personFields mask is required
then use following code:
profile = peopleService.people().get("people/me"). setRequestMaskIncludeField("person.names,person.emailAddresses,person.genders,person.birthdays").execute();
Thanks @AbrahamGharyali.
这篇关于如何使用FirebaseAuth从Google提供商获取性别和生日?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!