如何获取访问令牌? (Reddit API)

Posted

技术标签:

【中文标题】如何获取访问令牌? (Reddit API)【英文标题】:How to get access token? (Reddit API) 【发布时间】:2015-05-11 09:47:47 【问题描述】:

我想知道是否可以在 Reddit 上获得个人使用的永久访问令牌? 只有我在使用该应用程序。

对于用户,访问令牌会在 1 小时后过期。

我使用以下关于我的客户端 ID 和密码的信息,开始尝试获取访问令牌。 (MessageBox 显示“错误 401”)

如果用户将获得令牌,则必须在浏览器中单击“允许”。这里描述得很好。 https://github.com/reddit/reddit/wiki/OAuth2 这不是我所追求的。我追求个人使用,仅通过代码访问令牌。这可能吗?

            String requestUrl = "https://ssl.reddit.com/api/v1/access_token";

        RestSharp.RestClient rc = new RestSharp.RestClient();
        RestSharp.RestRequest request = new RestSharp.RestRequest(requestUrl, RestSharp.Method.POST);
        request.AddHeader("Content-Type", "application/json");
        //request.AddHeader("Authorization", ""); //???
        request.AddHeader("x-li-format", "json");

        request.AddParameter("client_id", "abcdefg");
        request.AddParameter("client_secret", "abc123-456");
        request.AddParameter("grant_type", "abc123-456");
        request.AddParameter("scope", "identity");
        request.AddParameter("state", "adhasegw"); //whatever value
        request.AddParameter("duration", "permanent");
        request.AddParameter("redirect_uri", "http://mywebsite.co");

        request.RequestFormat = RestSharp.DataFormat.Json;

        RestSharp.RestResponse restResponse = (RestSharp.RestResponse)rc.Execute(request);
        RestSharp.ResponseStatus responseStatus = restResponse.ResponseStatus;



        MessageBox.Show(restResponse.Content.ToString() + "," + responseStatus.ToString());

【问题讨论】:

【参考方案1】:

截至目前,您无法检索永久访问令牌。您有 2 个接近的选项。

第一个是在使用标准 OAuth 流程时请求“刷新”令牌。这就是您通过在代码中将“持续时间”作为“永久”发送来执行的操作。刷新令牌可用于自动检索新的 1 小时访问令牌,无需用户干预;唯一的手动步骤是对刷新令牌的初始检索。

仅在编写供个人使用的脚本时适用的第二种选择是使用password 授权类型。这些步骤在reddit的"OAuth Quick Start" wiki page上有更详细的描述,但我会在这里总结一下:

    使用 type = "script" 创建 OAuth 客户端(在 https://www.reddit.com/prefs/apps 下) 使用 POST 参数 grant_type=password&username=<USERNAME>&password=<PASSWORD>https://www.reddit.com/api/v1/access_token 发出请求。将您的客户端 ID 和密码作为 HTTP 基本身份验证发送。 <USERNAME> 必须注册为您发送的 OAuth 2 客户端 ID 的开发者。

【讨论】:

【参考方案2】:

可以通过转到https://www.reddit.com/prefs/apps 并创建一个应用程序为reddit 帐户生成client_idclient_secret

我隐藏的部分是我的client_id

然后你可以使用像praw 这样的客户端来访问reddit,例如使用 Python:

import praw
r = praw.Reddit(client_id='insert id here',
                client_secret='insert secret here',
                user_agent='insert user agent')
page = r.subreddit('aww')
top_posts = page.hot(limit=None)
for post in top_posts:
    print(post.title, post.ups)

您可以使用当前浏览器的用户代理,可以通过谷歌搜索“我的用户代理是什么”(以及其他方式)轻松找到。

【讨论】:

client_secret 是什么?我看到你只有client_id 在Reddit的授权申请页面点击“编辑”查看client_secret

以上是关于如何获取访问令牌? (Reddit API)的主要内容,如果未能解决你的问题,请参考以下文章

如何获取虚拟谷歌访问令牌来测试 oauth google api

用户在springboot中调用注册休息API时如何获取oAuth2访问令牌?

ASP.NET Web API 和 OpenID Connect:如何从授权码中获取访问令牌

无法刷新 Reddit OAuth 2.0 访问令牌

如何从谷歌 api 令牌中获取数据?

如何通过方法(不是api)通过identityserver4获取访问令牌?