API интеграции Facebook: результат не найден на моей странице - PullRequest
0 голосов
/ 10 мая 2018

Я уже создаю Мои приложения в https://developers.facebook.com, и у меня уже есть идентификатор приложения и секрет приложения. который я уже установил на мой

client_id = "Сначала я спрячу", client_secret = "Сначала я спрятан",

У меня вопрос, когда я запускаю свое приложение, на моей странице cshtml ничего не найдено.

loginController:

private Uri RediredtUri

{

    get

    {

        var uriBuilder = new UriBuilder(Request.Url);

        uriBuilder.Query = null;

        uriBuilder.Fragment = null;

        uriBuilder.Path = Url.Action("FacebookCallback");

        return uriBuilder.Uri;

    }

}




[AllowAnonymous]

public ActionResult Facebook()

{

    var fb = new FacebookClient();

    var loginUrl = fb.GetLoginUrl(new

    {

        client_id = "I hide it first",

        client_secret = "I hide it first",

        redirect_uri= RediredtUri.AbsoluteUri,

        response_type="code",

        scope="email"
    });

    return Redirect(loginUrl.AbsoluteUri);

}




public ActionResult FacebookCallback(string code)

{

    var fb = new FacebookClient();

    dynamic result = fb.Post("oauth/access_token", new

    {

        client_id = "I hide it first",

        client_secret = "I hide it first",

        redirect_uri = RediredtUri.AbsoluteUri,

        code = code

    });

    var accessToken = result.access_token;

    Session["AccessToken"] = accessToken;

    fb.AccessToken = accessToken;

    dynamic me = fb.Get("me?fields=link,first_name,currency,last_name,email,gender,locale,timezone,verified,picture,age_range");

    string email = me.email;

    TempData["email"] = me.email;

    TempData["first_name"] = me.first_name;

    TempData["lastname"] = me.last_name;

    TempData["picture"] = me.picture.data.url;

    FormsAuthentication.SetAuthCookie(email, false);

    return RedirectToAction("Login", "login");

}

Login.cshtml:

@Html.ActionLink("Login with facebook", "Facebook", "login")

<table>

    <tr><td>Email:</td><td><b>@TempData["email"]</b></td></tr>

    <tr><td>First Name:</td><td><b>@TempData["first_name"]</b></td></tr>



    <tr><td>Last Name:</td><td><b>@TempData["lastname"]</b></td></tr>

    <tr><td>Picture:</td><td><b><img src="@TempData["picture"]" /></b></td></tr>



</table>

У меня есть образец изображения. Sample Image

1 Ответ

0 голосов
/ 10 мая 2018

Похоже, вы используете FB-аутентификацию с SDK, похожим на в этом примере . Если вы уверены, что me.email содержит данные электронной почты и после перенаправления вы получаете пустые значения (обратите внимание, что я обнаружил, что вы используете TempData для отображения результатов на странице просмотра входа в систему), возможно, вам нужно сохранить содержимое TempData до перенаправление с использованием TempDataDictionary.Keep() метод:

public ActionResult FacebookCallback(string code)
{
    var fb = new FacebookClient();
    dynamic result = fb.Post("oauth/access_token", new
    {
        client_id = "your_app_id",
        client_secret = "your_app_secret_key",
        redirect_uri = RediredtUri.AbsoluteUri,
        code = code

    });

    var accessToken = result.access_token;
    Session["AccessToken"] = accessToken;

    fb.AccessToken = accessToken;
    dynamic me = fb.Get("me?fields=link,first_name,currency,last_name,email,gender,locale,timezone,verified,picture,age_range");

    string email = me.email;

    TempData["email"] = me.email;

    TempData["first_name"] = me.first_name;

    TempData["lastname"] = me.last_name;

    TempData["picture"] = me.picture.data.url;

    // add this line to keep TempData values when passing to view
    TempData.Keep();

    FormsAuthentication.SetAuthCookie(email, false);
    return RedirectToAction("Login", "login");
}

Причину использования TempDataDictionary.Keep() можно найти здесь .

В качестве примечания лучше использовать строго типизированные свойства viewmodel и назначать в них все значения, хранящиеся в TempData, чтобы избежать потери содержимого TempData при передаче в представление:

Модель

public class FBUser
{    
    public string Email { get; set; }

    // other properties
}

Действие контроллера (логин)

var model = new FBUser();

model.Email = TempData["email"];
// other properties assignment

// other stuff

return View(model);

View

@model FBUser

@Html.ActionLink("Login with Facebook", "Facebook", "login")

<table>
    <tr>
       <td>Email:</td>
       <td>
          <b>@Html.LabelFor(m => m.Email)</b>
       </td>
    </tr>

    <!-- other properties -->

</table>

<!-- other stuff -->
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...