如何使用 Oauth2 和 chrome.identity 获取 Facebook 令牌

Posted

技术标签:

【中文标题】如何使用 Oauth2 和 chrome.identity 获取 Facebook 令牌【英文标题】:How get Facebook token using Oauth2 with chrome.identity 【发布时间】:2014-02-14 06:13:18 【问题描述】:

我在打包的应用程序中使用 chrome.identity 来使用 Facebook 获取用户令牌。我调用chrome.identity.launchWebAuthFlow,我需要获取访问令牌,将其发送到服务器,然后访问令牌用于验证用户。

与 Google+ 完美搭配。但由于某种原因,它不适用于 Facebook。出于某种原因,Facebook 的 OAuth 似乎很特别。我已将 extensionid.chromiumapp.org 添加到 API 中的重定向 URL 列表中。添加了

"https://extensionid.chromiumapp.org/*",
    "https://facebook.com/*",
    "https://www.facebook.com/dialog/",
    "https://graph.facebook.com/*"

到 manifest.json。但什么都没有改变。

在调用 chrome.identity.launchWebAuthFlow 时,我使用这样的 URL

"https://www.facebook.com/dialog/oauth/access_token?" +
                   "client_id=myclientid&client_secret=myclientsecret&" + 
                  "response_type=token&grant_type=client_credentials"

当我尝试调用它时,我收到以下错误消息:

«launchWebAuthFlow completed Object message: "Authorization page could not be loaded." »

当我使用像

这样的 URL
«"https://www.facebook.com/dialog/oauth?client_id=myclientid&redirect_uri=https://myextensionid.chromiumapp.org/facebook.com=token&scope=user"» 

我得到下一个错误:

«launchWebAuthFlow completed Object message: "User interaction required." undefined »

我尝试在 4 天内获得 facebook 令牌。我累了。我做错了什么? 为什么 chrome.identity.getAuthToken 适用于 Google+ 而 chrome.identity.launchWebAuthFlow 不适用于 Facebook?

我希望有人做过同样的事情并且可以帮助我。

【问题讨论】:

不是“需要用户交互”。提醒你什么?调用 crome.identity.launchWebAuthFlow() 时是否使用了“交互式”标志? 我用——chrome.identity.launchWebAuthFlow( 'interactive': false, 'url':authUrl, function(token) );和 — var authUrl = "facebook.com/dialog/oauth/access_token?"+ "client_id=myclientId&client_secret=myclientSecret&" + "response_type=token"; 你试过把“interactive”改成true吗? 【参考方案1】:

我已经解决了这个问题。这是一个例子https://github.com/blackgirl/Facebook_Oauth2_sample_for_extensions

【讨论】:

只是想补充一点,您需要在 facebook 应用设置中批准域。转到高级 -> 启用嵌入式浏览器 OAuth 登录并将您的网址放在“有效的 OAuth 重定向 URI”中。【参考方案2】:

“需要用户交互”。消息表示用户需要登录 Facebook,和/或批准请求的 OAuth 范围。设置 interactive: true 标志将允许 identity.launchWebAuthFlow 显示一个窗口,用户将在其中执行这些步骤。由于您传递了 interactive: false 标志,因此 identity.lauchWebAuthFlow 失败。

https://www.facebook.com/dialog/oauth 很可能是您要用于启动流程的 URL。 client_credentials 授权通常用于您访问应用拥有的资源而不是特定用户拥有的资源的情况。

但是,如果您确实想调试“无法加载授权页面”的情况,则可以打开 chrome://net-internals 并查找来自 Facebook 的错误响应。

【讨论】:

【参考方案3】:
chrome.identity.launchWebAuthFlow(
'url': 'https://www.facebook.com/dialog/oauth?client_id=myclientid&redirect_uri=https://myextensionid.chromiumapp.org/facebook.com=token&scope=user, 'interactive': true,
function(redirect_url)  
    /* Extract token from redirect_url */ 
    console.log(redirect_url);
);

//'交互式': true

这个标志会做什么,会显示一个对话框询问用户名和密码 成功登录后,它将要求授予访问权限,只需按下该按钮即可 您将在上面的函数体中收到重定向 url。

【讨论】:

以上是关于如何使用 Oauth2 和 chrome.identity 获取 Facebook 令牌的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Angular 2 发送 OAuth2 的客户端 ID 和秘密 ID?

如何使用 OAuth2 和社交登录保护 Spring Boot RESTful 服务

如何同时使用 Bearer 和 oauth2 passport.js 策略?

如何实际使用使用不和谐 oauth2 请求的数据

如何使用 Oauth2 和 chrome.identity 获取 Facebook 令牌

如何使用 Spring Security 5 和 OAuth2 Client 获取刷新令牌并进行 API 调用?