Xamarin中AWS Cognito集成Facebook认证后无法获取用户邮箱
解决Xamarin Android中Facebook登录后获取用户邮箱的问题
我之前也碰到过一模一样的情况!你已经成功走完登录流程拿到了Facebook的AccessToken,但邮箱这类用户个人信息并不会直接包含在AccessToken里,必须通过Facebook的Graph API主动请求才能获取。以下是具体的解决步骤和代码修改方案:
核心思路
登录成功后,利用拿到的AccessToken发起Graph API请求,明确指定要获取的用户字段(比如email、name),然后从返回结果中提取邮箱信息。
修改你的登录回调代码
在HandleSuccess方法中添加Graph API请求的逻辑,替换/补充你现有的代码:
HandleSuccess = loginResult => { string userID; var accessToken = loginResult.AccessToken; userID = accessToken.UserId; var permissions = accessToken.Permissions; // 先检查用户是否授权了email权限 if (!permissions.Contains("email")) { // 如果没授权,可以引导用户重新请求邮箱权限 LoginManager.Instance.LogInWithReadPermissions(_activity, new List<string> { "email" }); return; } // 发起Graph API请求,获取用户邮箱等信息 var request = GraphRequest.NewMeRequest(accessToken, (obj, response) => { if (response.Error == null) { // 解析返回的用户数据 var userData = obj as Java.Util.HashMap; // 或者用JSONObject,根据实际返回类型调整 string email = userData.Get("email")?.ToString(); string userName = userData.Get("name")?.ToString(); // 这里可以将邮箱存入你的数据库,或者同步到Amazon Cognito if (!string.IsNullOrEmpty(email)) { // 示例:调用你的数据库存储方法 // SaveEmailToDatabase(email, userID); // 也可以把邮箱传递给之前的AuthSuccess方法 App.OnFacebookAuthSuccess(accessToken.Token, email); } } else { // 处理Graph API请求错误 App.OnFacebookAuthFailed(); } }); // 必须明确指定要获取的字段,默认返回的字段很少 var parameters = new Android.OS.Bundle(); parameters.PutString("fields", "id,name,email"); request.Parameters = parameters; request.ExecuteAsync(); },
关键注意点
- 指定请求字段:Graph API默认只返回
id和name,必须通过fields参数明确指定email才能获取到邮箱。 - 权限检查:先确认用户确实授权了
email权限,如果没授权,需要重新发起权限请求,避免Graph API返回空的邮箱字段。 - 数据解析:返回的用户数据是Java的
HashMap或者JSONObject,根据Xamarin的绑定情况调整解析方式。
这样修改后,你就能成功获取到用户的邮箱,然后存入你的数据库或者同步到Amazon Cognito了。
内容的提问来源于stack exchange,提问作者maria nabil
相关产品推荐
相关产品推荐

