使用PRAW Reddit API OAuth授权码流时遭遇Bad Request错误
问题
我用Python脚本通过OAuth授权码流进行身份验证,访问生成的授权URL时收到错误提示:bad request (reddit.com) you sent an invalid request — that option is not valid.
相关代码如下:
reddit_OAuth2.py
class OAuthRedditAccess(): def __init__(self, client_id, client_secret, user_agent, redirect_url): self.user_agent = user_agent self.client_id = client_id self.client_secret = client_secret self.redirect_url = redirect_url reddit_read_only = praw.Reddit(client_id=self.client_id, client_secret=self.client_secret, user_agent=self.user_agent) print("read only client instatiated.") def OAuth2(self): reddit = praw.Reddit(client_id=self.client_id, client_secret=self.client_secret,redirect_uri=self.redirect_url, user_agent=self.user_agent) _auth_url = reddit.auth.url(scopes=["identity"], state="...", duration="permanent") print("Authorization url is ",_auth_url)
main.py
if __name__ == '__main__': user_agent = "script:producer_reddit_api:v1.0 (by /u/my_id)" redirect_url = "http://localhost:8080" client_id = os.environ.get("client_id") client_secret = os.environ.get("client_secret") OAuth_obj = OAuthRedditAccess(client_id, client_secret, user_agent, redirect_url) OAuth_obj.OAuth2()
备注:我已通过以下代码验证client_id和client_secret正确,能输出正确用户名:
reddit = praw.Reddit( client_id = <my_client_id>, client_secret=<my_secret_id>, password=<password+2FA_auth_code>, user_agent = "script:producer_reddit_api:v1.0 (by /u/my_id)", username=<my_username>) print(reddit.user.me())
解决方案
- 校验重定向URI一致性:确认Reddit开发者控制台中注册的重定向URI与代码里的
redirect_url完全匹配,包括协议、端口号,不能有拼写或格式差异。 - 替换无效的
state参数:代码中state="..."是非法值,需替换为随机生成的字符串(比如用secrets.token_hex(16)生成),用于防范CSRF攻击。 - 检查应用类型设置:在Reddit开发者后台,应用类型需设为
web app或installed app,script类型应用不支持授权码流的重定向模式。 - 测试
duration参数:若应用权限不支持永久令牌,可尝试将duration="permanent"改为"temporary"验证是否正常。
内容的提问来源于stack exchange,提问作者ujzwalp
相关产品推荐
相关产品推荐

