gpt4 book ai didi

c# - 迁移到 OAuth 2.0 后获取 access_token 时出现问题

转载 作者:太空狗 更新时间:2023-10-29 21:24:17 26 4
gpt4 key购买 nike

我已尝试将我的应用程序迁移到 OAuth 2.0 例程。我无法从 JavaScript API 设置的 cookie 获取 access_token。我解码了 cookie 中的信息,但我得到的不是 access_token 和用户信息,而是代码。这似乎是一个相当奇怪的变化。是否有任何解决方法,因为当您在获取代码时未指定 redirect_uri 时,似乎无法将代码交换为 access_token。

我考虑过从 JavaScript API 的响应中获取 access_token 并将其存储在 cookie 中,但这有点违背了扩展安全性的全部目的,我想问问是否有合适的方法来做到这一点。

可能是我做错了什么,如果是这样请告诉我:)

编辑我知道 cookie 包含一个签名请求,但根据文档,签名请求应该包含我需要的信息,如 access_token 和 uid,但在我的实例中它只包含代码。这基本上是我不明白的部分。

最佳答案

事实证明(即使没有记录)我们需要自己用代码交换 access_token。我认为这完全是浪费,因为那是旧 cookies 的好处。获取 access_token 既快速又容易。

无论如何。要从新的 cookie 中获取 access_token,您需要执行以下操作:

public string ReturnAccessToken()
{
HttpCookie cookie = htc.Request.Cookies[string.Format("fbsr_{0}", facebookAppID)];
string jsoncode = System.Text.ASCIIEncoding.ASCII.GetString(FromBase64ForUrlString(cookie.Value.Split(new char[] { '.' })[1]));

JsonData data = JsonMapper.ToObject(jsoncode);

getAccessToken(data["code"].ToJson()
}

private string getAccessToken(string code)
{
//Notice the empty redirect_uri! And the replace on the code we get from the cookie.
string url = string.Format("https://graph.facebook.com/oauth/access_token?client_id={0}&redirect_uri={1}&client_secret={2}&code={3}", "YOUR_APP_ID", "", "YOUR_APP_SECRET", code.Replace("\"", ""));

System.Net.HttpWebRequest request = System.Net.WebRequest.Create(url) as System.Net.HttpWebRequest;
System.Net.HttpWebResponse response = null;

using (response = request.GetResponse() as System.Net.HttpWebResponse)
{
System.IO.StreamReader reader = new System.IO.StreamReader(response.GetResponseStream());

string retVal = reader.ReadToEnd();
return retVal;
}
}

public byte[] FromBase64ForUrlString(string base64ForUrlInput)
{
int padChars = (base64ForUrlInput.Length % 4) == 0 ? 0 : (4 - (base64ForUrlInput.Length % 4));
StringBuilder result = new StringBuilder(base64ForUrlInput, base64ForUrlInput.Length + padChars);
result.Append(String.Empty.PadRight(padChars, '='));
result.Replace('-', '+');
result.Replace('_', '/');
return Convert.FromBase64String(result.ToString());
}

这似乎有点多余,但我想您可以将 access_token 存储在 session 变量中。如果你这样做并且 iFrame 是你在 Facebook 上的应用程序,你需要知道如果用户将他的浏览器隐私设置设置为中等,它将无法在 IE 6、7 和 8 中运行。有一个解决方法,但由于它不是这个问题的一部分,所以我不会写它。如果人们真的想要它,请发表评论,我会展示它:)

--------------------------------编辑---- --------------------------------------

当使用任何旧的 IE 浏览器时,您不能在 Iframed 页面中使用 cookie 或 session 变量,例如您在 Facebook 上的页面。这是一个在编码中无法真正充分解决的问题。充分我的意思是解决方案不好。您需要在响应中设置 p3p-header。您当然可以在为您服务的所有页面编码时执行此操作,但最简单的解决方案(如果您使用 .NET 服务器托管您的页面)是为 IIS 设置 p3p 策略。可以在 http://support.microsoft.com/kb/324013 中看到这方面的指南。 .你在 p3p 政策中写了什么并不重要(如果你检查 Facebook 自己的,你会看到他们使用“我们没有 p3p 政策”),重要的是有一些东西。我只是使用虽然是随机文本,但如果您使用示例中的文本,应该没有问题:)

我花了很长时间才找到它,所以我希望有人可以使用它 :D

关于c# - 迁移到 OAuth 2.0 后获取 access_token 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7201521/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com