จัดเก็บ UserTokens ที่สร้างโดย ASP.Net Core Identity สำหรับผู้ให้บริการเข้าสู่ระบบภายนอก

ฉันใช้ Facebook เป็นการเข้าสู่ระบบภายนอกของข้อมูลประจำตัว ASP.Net Core ฉันต้องการแม้ว่าผู้ใช้จะเข้าสู่ระบบด้วย Facebook ผู้ใช้จะกรอกโปรไฟล์ของเขาบนเว็บไซต์ เพื่อที่ฉันจะใช้วิธี ExternalLoginCallback ซึ่งฉันต้องการรับข้อมูลจาก Facebook เช่น วันเกิด สถานที่ (ประเทศ) ...

ปัญหาหนึ่งคือหากผู้ใช้ยกเลิกการเลือกสิทธิ์บางอย่าง การโทรเริ่มต้นไปยัง Facebook จะล้มเหลว:

var info = await _signInManager.GetExternalLoginInfoAsync();
if (info == null)
    return RedirectToAction(nameof(Login));

// Sign in the user with this external login provider if the user already has a login.
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);

ฉันยังต้องทำการตรวจสอบเพิ่มเติมเกี่ยวกับข้อมูลผู้ใช้ ซึ่งจะต้องเรียก Graph API โดยตรง

จุดบล็อกของฉัน: - ในวิธี ExternalLoginCallback ฉันจะต้องแยก 'ประเทศ' และ 'วันเกิด' เพื่อหลีกเลี่ยงไม่ให้ Facebook API ส่งกลับข้อผิดพลาดในกรณีที่ผู้ใช้ไม่ได้รับอนุญาต - เพื่อที่ฉันจะต้อง ผู้ใช้ access_token (และสำหรับการโทรเพิ่มเติมในวิธีการ) ฉันไม่เห็นวิธีรับมันแม้ว่าจะถูกใช้โดยกรอบงาน Facebook Identity - เมื่อสร้างโปรไฟล์แล้ว ฉันต้องการเข้าถึง access_token นี้ซึ่งควร ถูกจัดเก็บไว้ในตาราง UserTokens (เดานะ?) แต่ฉันหาไม่เจอ เพราะตารางว่างเปล่า (DbContext ของฉันเป็นคลาสที่ขยาย IdentityDbContext<AppUser, AppRole, long> ไม่รู้ว่ามีผลกระทบหรือไม่)

ฉันพบคำตอบนี้แล้ว https://stackoverflow.com/a/42670559/4881677 ซึ่งอาจช่วยได้ แต่ไม่เพียงพอ

ความช่วยเหลือใด ๆ ? :)




คำตอบ (1)


ในการจัดเก็บโทเค็น Facebook ของผู้ใช้ จะต้องระบุโทเค็นนั้นในตัวเลือก (ไม่ได้จัดเก็บไว้ตามค่าเริ่มต้น)

var fo = new FacebookOptions();
fo.SaveTokens = true;

จากนั้นเราสามารถเรียกการอนุญาตของเมธอดกราฟเพื่อรับสิทธิ์ที่มีอยู่: https://graph.facebook.com/me/permissions?access_token={token}

จากนั้นจึงสามารถอ่านได้ดังนี้:

foreach (var perm in data)
{
   perms.Add((string)perm["permission"], (string)perm["status"]);
}
person Jean    schedule 08.08.2017