Instagram API:scopes是否适用于OAuth2隐式认证流程?

10

我正在从移动应用程序对Instagram API进行请求。目前,我只是将用户引导到Instagram授权URL,并指定响应类型为“access_token”。指定此response_type被称为隐式授权。

显式授权:response_type=code 隐式授权:response_type=access_token

我正试图避免需要建立一个Web服务来促进明确的身份验证。这是必要的,因为在明确的身份验证流程中,Instagram API需要调用重定向URL并传递“code”参数。然后,我的服务器端代码将使用该代码向Instagram发出最终请求以获得访问令牌。

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

Instagram支持以下范围:

  • basic - 读取与用户相关的任何和所有数据(例如关注/被关注列表、照片等)(默认情况下授权)
  • comments - 代表用户创建或删除评论
  • relationships - 代表用户关注和取消关注其他用户
  • likes - 代表用户喜欢和取消喜欢条目

当我除了“basic”之外的任何其他类型的范围规范时,在用户提供认证URL时会收到以下响应:

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

除了“basic”范围之外的任何组合都会产生相同的响应。

所以,我的问题如下:

  • 是否需要显式授权才能指定超出“basic”范围的范围?
  • 我需要指定response_type=code才能使用扩展范围吗?
  • 这是Instagram的限制还是OAuth 2.0的限制?

提前致谢。

7个回答

9

我刚刚尝试使用隐式OAuth流程,使用我的client_id和scope=basic+likes,它成功了。请用你的client_id和redirect_uri替换下面的URL并尝试。

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

也许Instagram不允许新客户端帐户除基本范围以外的范围...

1
我创建了gramfeed.com,客户端implicit oauth不太安全,人们滥用它通过收集access token来实现自动点赞/评论的功能,所以Instagram有可能会禁用此功能。我可以找出原因并让您知道。 - krisrak
刚刚试用了一下Gramfeed,非常酷!另外,我注意到我的IG请求中有一件事...User.Counts.FollowedBy属性总是为0。其他计数(如Follows和Media)都没问题,但Followers总是0。非常奇怪。 - NovaJoe
1
刚刚给你发送了一个 LinkedIn 邀请。 - NovaJoe
原来我的问题与我使用的Xamarin.Auth组件有关。Xamarin.Auth本质上只是一个带有处理OAuth的一些功能的Webview。所以,我可以为Instagram自己编写身份验证UI,或者深入研究Xamarin.Auth源代码,找到根本问题。感谢你的帮助! - NovaJoe
嗯,百分号编码的URL也应该可以工作,我的应用程序发送百分号编码的登录请求,并且它可以工作,无论如何,很高兴你能找到问题。 - krisrak
显示剩余5条评论

7

我曾经遇到过类似的问题,当我尝试获取多个范围(basic、likes、comments)的权限时,编码中的+号会出现问题。我发现的解决方法是在每个范围之间使用空格:

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

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

考虑到Instagram文档在此页面底部指定每个范围之间使用“+”符号,这很有趣:http://instagram.com/developer/authentication/ - NovaJoe

7
答案是是的,作用域可以通过隐式授权流程很好地请求。我的问题与我使用的OAuth组件有关。该组件在静默URL编码范围参数的值,这被Instagram授权终点拒绝。我更新了组件(Xamarin.Auth)以适应非编码范围参数并发布拉请求。
感谢@krisak提供可测试的工作URL。

没错!请检查您的浏览器URL是否包含类似于'scope=likes+comments'而不是'scope=likes%2Ccomments' - 请注意,URL编码器通常会将'+'重新编码为%2B。 - Dunc

6
很不幸,自2015年4月14日起,新用户无法获得除“基本”以外的任何范围的访问权限。官方消息可在客户端配置页面上找到:
引用: 从2015年4月14日开始,新用户需要请求访问权限才能发布“喜欢”,“关注”和“评论”。更多信息请阅读开发人员博客:http://developers.instagram.com
该消息参考以下博客文章:http://developers.instagram.com/post/116410697261/publishing-guidelines-and-signed-requests
Instagram要求发送个人请求以启用您的应用程序(客户端ID)的范围,但您的应用程序必须满足博客文章中描述的某些条件。

我最近也看到了。很糟糕。我原本计划使用评论和点赞。 - NovaJoe

2

我有同样的问题,我找到了这个解决方案,它很有效。

进入Instagram/开发者下的管理客户端。然后在您的应用程序下点击编辑,并取消选择禁用隐式OAuth。现在它将按预期工作。

不过,Instagram出于某种原因更改了此设置,因此在公开应用程序之前应该三思而后行:http://instagram.com/developer/restrict-api-requests/


哈!非常酷!那真的很有道理。不错的发现! - NovaJoe

1

目前,即2015年5月,是可以的。

Instagram文档中所述有关身份验证:

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

您首先需要在此处注册您的应用程序,然后使用Instagram提供的CLIENT ID进行此请求:

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

您需要填写客户端ID和重定向URI。

仅供参考,在重定向URI字段中,您也可以插入

http://localhost

0

你必须在作用域之间添加“+”符号,例如“basic+comments+follower_list+likes+public_content+relationships”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接