Instagram API:范围是不是适用于 OAuth2 隐式身份验证流程?

Posted

技术标签:

【中文标题】Instagram API:范围是不是适用于 OAuth2 隐式身份验证流程?【英文标题】:Instagram API: do scopes work with OAuth2 implicit authentication flow?Instagram API:范围是否适用于 OAuth2 隐式身份验证流程? 【发布时间】:2013-12-14 06:47:04 【问题描述】:

我正在通过移动应用向 Instagram API 发出请求。目前,我只是将用户定向到 Instagram auth url 并将响应类型指定为“access_token”。指定此 response_type 称为隐式身份验证。

显式身份验证:response_type=code 隐式认证:response_type=access_token

我正在努力解决需要建立 Web 服务以促进显式身份验证的问题。这是必要的,因为在显式身份验证流程中,Instagram API 需要调用重定向 URL 并传入“代码”参数。然后,我的服务器端代码将使用该代码向 Instagram 发出最终请求以获取访问令牌。

移动应用使用隐式流更有效,因为不需要额外的私人维护的身份验证服务来处理它。

Instagram 支持以下范围:

basic - 读取与用户相关的所有数据(例如 关注/关注列表、照片等)(默认授予) cmets - 代表用户创建或删除 cmets 关系 - 代表用户关注和取消关注用户 喜欢 - 代表用户喜欢和不喜欢项目

当我制定除“基本”之外的任何其他类型的范围规范时,当用户在身份验证 URL 处提供凭据时,我会收到以下响应:

"code": 400, "error_type": "OAuthException", "error_message": "Invalid scope field(s): basic+likes"

“基本”以外的任何范围组合都会给出相同的响应。

所以,我的问题是:

是否需要显式身份验证才能指定“基本”以外的范围?? 是否需要指定 response_type=code 才能使扩展范围起作用? 这是 Instagram 的限制,还是 OAuth 2.0 的限制?

提前致谢。

【问题讨论】:

【参考方案1】:

我刚刚尝试使用我的 client_id 和 scope=basic+likes 的隐式 oauth 流,它起作用了。将下面的 url 替换为您的 client_id 和 redirect_uri,然后尝试。

https://instagram.com/oauth/authorize/?client_id=CLIENT_ID&redirect_uri=REDIRECT-URI&response_type=token&scope=basic+likes

可能是 Instagram 不允许新客户帐户的基本范围以外的范围...

【讨论】:

糟糕。这真的很糟糕。根据我的阅读,他们的支持电子邮件几个月都没有得到答复。 我创建了 gramfeed.com,客户端隐式 oauth 不是很安全,人们通过从任何用于自动喜欢/cmets 的应用程序收集 access_token 来滥用它,因此可能是 instagram 被禁用,我可以找出并让你知道。 啊……我明白了。很可能是这样。我可以看到它会如何被滥用。这就是为什么我在想如果我使用显式(access_token)身份验证流,我可能能够获得我想要的范围。我想我必须建立自己的代理身份验证服务,以便移动代码可以调用它。是的!,如果你能找到的话,我会非常感激的!谢谢! 刚刚签出了 Gramfeed,顺便说一句。很酷!关于我的 IG 请求,我注意到的另一件事...... User.Counts.FollowedBy 属性始终为 0。其他计数(如 Follows 和 Media)很好,但 Followers 始终为 0。非常奇怪。 刚刚向您发送了 LinkedIn 邀请。【参考方案2】:

这里的答案是是的,范围可以通过隐式身份验证流来请求就好了。我的问题与我正在使用的 OAuth 组件有关。该组件默默地对范围参数的值进行 URL 编码,但被 Instagram auth 端点拒绝。我更新了组件 (Xamarin.Auth) 以适应非编码范围参数并发出拉取请求。

感谢 @krisak 提供了一个我可以测试的有效 URL。

【讨论】:

是的,完全正确!检查您的浏览器 URL 是否包含类似 'scope=likes+cmets' 而不是 'scope=likes%2Ccmets' - 请注意 URL 编码器经常将 '+' 重新编码为 %2B。【参考方案3】:

因此,在尝试获得多个范围(基本、喜欢、cmets)的权限时,我在 + 的编码方面遇到了类似的问题。我找到的解决方案是在各个范围之间使用空格:

在 config/initializers/omniauth.rb 文件中:

Rails.application.config.middleware.use OmniAuth::Builder do
    provider :instagram, 'TOKEN', 'SECRETKEY' , :scope => "basic likes comments"
end

【讨论】:

这很有趣,考虑到 Instagram 文档在此页面底部的每个范围之间指定了一个“+”:instagram.com/developer/authentication【参考方案4】:

很遗憾,从 2015 年 4 月 14 日开始,除了基本,新客户无法访问任何范围。官方消息可以在客户端配置页面找到:

从 2015 年 4 月 14 日开始,新客户需要申请访问权限才能发布喜欢、关注和 cmets。如需更多信息,请阅读开发者博客http://developers.instagram.com。

该消息参考以下博客条目:http://developers.instagram.com/post/116410697261/publishing-guidelines-and-signed-requests

Instagram 要求发送个人请求以启用您的应用程序(客户端 ID)的范围,但您的应用程序必须满足博客条目中描述的某些条件。

【讨论】:

我最近也看到了。蹩脚的。我打算使用评论和点赞。【参考方案5】:

我有同样的问题,我找到了这个解决方案并且工作正常

转到 instagram/developer 下的管理客户端。然后单击您的应用下的编辑并取消选中禁用隐式 OAuth。现在它将按预期工作。

不过,Instragram 改变了这一点是有原因的,所以在公开你的应用之前可能应该三思而后行:http://instagram.com/developer/restrict-api-requests/

【讨论】:

哈!很酷!这实际上很有意义。很好的发现!【参考方案6】:

此时,2015 年 5 月,是的。

正如instagram documentation 中关于身份验证的解释:

Instagram API 使用 OAuth 2.0 协议进行简单但 有效的认证和授权。 OAuth 2.0 更容易 使用比以前的方案和开发人员可以开始使用 Instagram API 几乎立即。要记住的一件事是 对 API 的所有请求都必须通过 SSL(https:// 不是 http://)。

您首先需要注册您的应用程序here,然后使用 instagram 提供的 CLIENT ID,您可以执行此请求:

https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code

你必须把你的client_id和redirect_uri放在哪里。

仅供参考,在redirect_uri 字段中您也可以插入

http://localhost

【讨论】:

【参考方案7】:

您必须在“basic+cmets+follower_list+likes+public_content+relationships”这样的范围之间添加“+”

【讨论】:

以上是关于Instagram API:范围是不是适用于 OAuth2 隐式身份验证流程?的主要内容,如果未能解决你的问题,请参考以下文章

Instagram API 发布喜欢率限制

使用带有永久页面访问令牌的 Instagram Graph Api 仅适用于某些帐户

Jquery Instagram 提要仅适用于我的用户名

Instagram - 用于过滤日期范围内图像的 API

适用于 Android 的 Instagram 自定义 URL 方案

尝试授权用户并获取令牌时突然出现 Instagram API“范围”问题 - OAuth