• 1399/03/09

پرسیدن نام کاربری از یوزر وارد شده توسط گوگل :

درود و سپاس. من سه روزه درگیر این مساله ام و نتونستم حلش کنم.

 

توی آموزش ورود با گوگل، توی کدها ، موقعی که کاربر با گوگل وارد میشه از طریق 10 کاراکتر اول همون ایمیل، یک نام کاربری ساخته میشه و گفتین خودمون نام کاربری را از کاربر وارد شده با گوگل  بپرسیم. اما سوال:

در اکشن متد ExternalLoginCallBack ما سه پارامتر موجود داریم : reruenUrl , Email , externalLoginInfo که تعریفش طبق کد زیر هست:

var externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync();

و همون جا با این سه پارامتر براحتی یوزر خارجی را ساختید.

هدف: افزودن نام کاربری به پارامترهای فوق.

ابتدایک GoogleViewModel میسازم با چهار پارامتر زیر که سه تای اول را داریم و چهارمی را میخایم از یوزر بپرسیم:

public ExternalLoginInfo ExternalLoginInfo { get; set; }
public string Email { get; set; }
public string ReturnUrl { get; set; }
public string UserName  { get; set; }

اومدم یک مدل ساختم و سه تا پارامتر فوق را که داشتیم گذاشتم توش و پاس دادم به یک stronglyType با نام CreateExternalUser.cshtml :

public async Task<IActionResult> ExternalLoginCallBack()
   .   .   .   //some codes here
  
var model = new ExternalUserViewModel()
  {
    ExternalLoginInfo = externalLoginInfo,
    Email = email,
    ReturnUrl = returnUrl,
  };
                   
  return View("CreateExternalUser", model); 

توی CreateExternalUse.cshtml  یک فرم گذاشتم که 4 تا فیلد داره، سه تاش type=hidden هست و چهارمیuserName توسط کاربر تکمیل میشه و بعدا ارسال میشه به اکشن متد سازنده یوزر جدید. مشکل اینجاست که ایمیل و returnUrl و username به دستم میرسه ولی externalLoginInfo   را نال میده بهم و مسلما در دستور  در اکشن متد ایجاد کاربر خارجی زیر به مشکل میخورم :

await _userManager.AddLoginAsync(user, externalLoginInfo);

 

در تصویر زیر مشاهده میشود که مقدار  externalLoginInfo    در صفحه ورود یوزرنیم جدید، دریافت میشود و نال نمیباشد :

 

 

اما در اکشن متد ساخت یوزر خارجی نال می باشد:

 

 

ساده بخوام بپرسم، میتونم استرینگ ها ایمیل و returnUrl را منتقل کنم به اکشن متد بعدی، ولی externalLoginInfo  را نمیتونم. از طریق TempData هم یه جور دیگه اذیت میکنه. هیچ اروری نمیده فقط صفحه سفید توی مرور گر نشون میده و هیچ پیامی نمیده.

 

 

 

  • 1399/03/09
  • ساعت 15:15

سلام عزیز.

اگر نمیخواهید از TempData استفاده بکنید، میتونید یوزرنیم رو همون جوری که گفتم بسازید،

بعد توی پروفایل کاربر بهش اجازه بدید که بتونه یوزرنیم خودش عوض بکنه.


  • 1399/03/10
  • ساعت 12:14

درود. من میخوام از TempData استفاده کنم ولی externalLoginInfo   یک نوع Complex Object حساب میشه و نمیشه همین طوری فرستادش توی TempData.  چون NullPage میده. از طریق serialize هم که استفاده میکنم ارور  زیر را میده :

JsonException: A possible object cycle was detected which is not supported

 

ممنون میشم بهم بگید چطوری externalLoginInfo     را پاس بدم به اکشن متد بعدی.

 

پاسخ: نیاز به پاس دادن complex Data مانند externalLoginInfo       به اکشن متد بعدی نیست. دستور زیر در هر یک از اکشن متدهای کنترولر مورد بحث ما قابل شناسایی و اجرا می باشد.

var externalLoginInfo = await _signInManager.GetExternalLoginInfoAsync();

( 3 روز طول کشید!! ولی بجاش Serialize کردن TempData را هم فهمیدم)-- ممنون 


logo-samandehi