我真的在为如何获得 Instagram 的访问令牌而苦苦挣扎,
我已经注册了一个新客户端,然后我使用了这个 URL
填写客户 ID 并重定向 URL。
然后我被重定向到一个页面,它在 URL 中显示了一个代码,但是从那里我不知道 id 从哪里获取我的访问令牌。
我真的在为如何获得 Instagram 的访问令牌而苦苦挣扎,
我已经注册了一个新客户端,然后我使用了这个 URL
填写客户 ID 并重定向 URL。
然后我被重定向到一个页面,它在 URL 中显示了一个代码,但是从那里我不知道 id 从哪里获取我的访问令牌。
官方 API 文档的链接是http://instagram.com/developer/authentication/
长话短说 - 两个步骤:
获取代码
使用来自http://instagram.com/developer/clients/manage/的信息打开https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code
获取访问令牌
curl \-F 'client_id=CLIENT-ID' \
-F 'client_secret=CLIENT-SECRET' \
-F 'grant_type=authorization_code' \
-F 'redirect_uri=YOUR-REDIRECT-URI' \
-F 'code=CODE' \
https://api.instagram.com/oauth/access_token
到目前为止,人们发布的几乎所有回复都只涉及如何在前端处理访问令牌,遵循 Instagram 的客户端“隐式身份验证”程序。根据 Instagram 的 API 文档,这种方法不太安全且不推荐使用。
假设您使用的是服务器,Instagram 文档在提供有关将代码交换为令牌的明确答案方面有点失败,因为它们仅提供了 cURL 请求的示例。本质上,您必须使用提供的代码和所有应用程序信息向他们的服务器发出 POST 请求,他们将返回一个用户对象,包括用户信息和令牌。
我不知道您用什么语言编写,但我在 Node.js 中使用 request npm 模块解决了这个问题,您可以在此处找到。
我解析了 url 并使用此信息发送 post 请求
var code = req.url.split('code=')[1];
request.post(
{ form: { client_id: configAuth.instagramAuth.clientID,
client_secret: configAuth.instagramAuth.clientSecret,
grant_type: 'authorization_code',
redirect_uri: configAuth.instagramAuth.callbackURL,
code: code
},
url: 'https://api.instagram.com/oauth/access_token'
},
function (err, response, body) {
if (err) {
console.log("error in Post", err)
}else{
console.log(JSON.parse(body))
}
}
);
当然用你自己的信息替换 configAuth 的东西。您可能没有使用 Node.js,但希望此解决方案能帮助您将自己的解决方案翻译成您使用的任何语言。
我之前遇到过同样的问题,但是我将网址更改为
https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=token
Instagram API 不仅适用于您,还适用于任何可能使用您的应用进行身份验证的 Instagram 用户。我按照Instagram 开发网站上的说明进行操作。使用第一种(显式)方法,我可以很容易地在服务器上做到这一点。
步骤 1)向您的网页添加一个链接或按钮,用户可以单击该链接或按钮来启动身份验证过程:
<a href="https://api.instagram.com/oauth/authorize/?client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&response_type=code">Get Started</a>
YOUR_CLIENT_ID
并将YOUR_REDIRECT_URI
在您成功在 Instagram 后端注册您的应用程序后提供给您,并在YOUR_CLIENT_SECRET
下面使用。
步骤 2)在您为应用程序定义的 URI 处,与 相同YOUR_REDIRECT_URI
,您需要接受来自 Instagram 服务器的响应。Instagram 服务器将在请求中向您反馈一个code
变量。然后,您需要使用此code
信息和有关您的应用程序的其他信息直接从您的服务器发出另一个请求以获取access_token
. 我使用 Django 框架在 python 中做到了这一点,如下所示:
将 django 指向以下response
函数urls.py
:
from django.conf.urls import url
from . import views
app_name = 'main'
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^response/', views.response, name='response'),
]
这是response
处理请求的函数views.py
:
from django.shortcuts import render
import urllib
import urllib2
import json
def response(request):
if 'code' in request.GET:
url = 'https://api.instagram.com/oauth/access_token'
values = {
'client_id':'YOUR_CLIENT_ID',
'client_secret':'YOUR_CLIENT_SECRET',
'redirect_uri':'YOUR_REDIRECT_URI',
'code':request.GET.get('code'),
'grant_type':'authorization_code'
}
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
response_string = response.read()
insta_data = json.loads(response_string)
if 'access_token' in insta_data and 'user' in insta_data:
#authentication success
return render(request, 'main/response.html')
else:
#authentication failure after step 2
return render(request, 'main/auth_error.html')
elif 'error' in req.GET:
#authentication failure after step 1
return render(request, 'main/auth_error.html')
这只是一种方式,但该过程在 PHP 或任何其他服务器端语言中应该几乎相同。
2019 年行之有效的简单方法
在安全身份验证下禁用隐式 oauth,然后加载:
https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=token
在您的帐户中指定 REDIRECT-URI 并完全按照指定键入。
在您授权应用程序使用您的 Instagram 数据后,访问令牌将作为 URI 片段返回。它应该如下所示:
尝试这个:
http://dmolsen.com/2013/04/05/generating-access-tokens-for-instagram/
获取代码后,您可以执行以下操作:
curl -F 'client_id=[your_client_id]' -F 'client_secret=[your_secret_key]' -F 'grant_type=authorization_code' -F 'redirect_uri=[redirect_url]' -F 'code=[code]' https://api.instagram.com/oauth/access_token
100% 使用此代码
<a id="button" class="instagram-token-button" href="https://api.instagram.com/oauth/authorize/?client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&response_type=code">Click here to get your Instagram Access Token and User ID</a>
<?PHP
if (isset($_GET['code'])) {
$code = $_GET['code'];
$client_id='< YOUR CLIENT ID >';
$redirect_uri='< YOUR REDIRECT URL >';
$client_secret='< YOUR CLIENT SECRET >';
$url='https://api.instagram.com/oauth/access_token';
$request_fields = array(
'client_id' => $client_id,
'client_secret' => $client_secret,
'grant_type' => 'authorization_code',
'redirect_uri' => $redirect_uri,
'code' => $code
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_POST, true);
$request_fields = http_build_query($request_fields);
curl_setopt($ch, CURLOPT_POSTFIELDS, $request_fields);
$results = curl_exec($ch);
$results = json_decode($results,true);
$access_token = $results['access_token'];
echo $access_token;
exit();
}
?>
这对我来说很好:
http://jelled.com/instagram/access-token
仅供参考,我将它与您可以在此处找到的 jQuery Instagram 插件结合使用; http://potomak.github.com/jquery-instagram
通过使用https://www.hurl.it/我能够看到:{“code”:400,“error_type”:“OAuthException”,“error_message”:“未找到或已使用匹配代码。” }
所以:您必须为每个请求获取新代码。
如果您不想构建服务器端,例如仅在客户端(Web 应用程序或移动应用程序)上开发,您可以选择Implicit Authentication。
正如文档所说,首先使用 https 请求
填写您指定的CLIENT-ID和REDIRECT-URL。
然后就是进入登录页面了,不过最重要的是用户正确登录后如何获取访问令牌。
用户使用正确的帐户和密码单击登录按钮后,网页将重定向到您指定的 url,后跟新的访问令牌。
我不熟悉 javascript,但在 Android Studio 中,这是添加一个侦听器的简单方法,该侦听器侦听 网页覆盖 url 到新 url(重定向事件)的事件,然后它将重定向 url 字符串传递给you ,因此您可以轻松地将其拆分以获取访问令牌,例如:
字符串 access_token = url.split("=")[1];
意思是将url分解成每个“=”字符中的字符串数组,那么访问令牌显然存在于[1]处。
转到管理 clinet 页面:
http://www.instagram.com/developer/
设置重定向网址
然后 :
使用此代码获取访问令牌:
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>tst</title>
<script src="../jq.js"></script>
<script type="text/javascript">
$.ajax({
type: 'GET',
url: 'https://api.instagram.com/oauth/authorize/?client_id=CLIENT-ID&redirect_uri=REDIRECT-URI&response_type=code'
dataType: 'jsonp'}).done(function(response){
var access = window.location.hash.substring(14);
//you have access token in access var
});
</script>
</head>
<body>
</body>
</html>