library(httr)
# 1. Find OAuth settings for github:
http://developer.github.com/v3/oauth/
oauth_endpoints("github")
# 2. Register an application at
https://github.com/settings/applications
#Insert your values below - if secret is omitted, it will look it up in the GITHUB_CONSUMER_SECRET environmental variable.
#Use http://localhost:1410 as the callback urlmyapp <- oauth_app("github", "56b637a5baffac62cad9")
# 3. Get OAuth credentials
github_token <- oauth2.0_token(oauth_endpoints("github"), myapp)
# 4. Use API
gtoken <- config(token = github_token)
req <- GET("https://api.github.com/rate_limit", gtoken)
stop_for_status(req)
content(req)
# OR:
req <- with_config(gtoken, GET("https://api.github.com/rate_limit"))
stop_for_status(req)
content(req)
在3.0.2的Rgui下,按照https://github.com/hadley/httr/blob/master/demo/oauth2-github.r 进行github 操作,在返回token的这一步,一直出现redirect_uri_mismatch ERROR。在网上查了很久,又查看了github的OAuth帮助页面,不知如何解决,参考各种答案也是不明所以。
看到的回答多是说重设redirect_uri。
问题是要重设只能重设application里面的callback uri。已经来回换了好几次,依然报错。
本地代码里面,根本没出现过关于设置redirect uri的迹象,default值不知道在哪里。要重设本地的也无从入手。
这个问题一直困扰了我半个多月。今天又再回来处理这个问题,还是没有头绪。后来想,RStudio的配置比base的Rgui要人性化,说不定在RStudio能成功,或者至少能看出一点端倪。使用RStudio,在潜意识里,有种cheating的感觉,但也实在没有办法。
在RStudio中试过之后,依然报出mismatch的错误。
但是在跳转网页的过程中,request持续了较长时间。然后我观察了一下request的url,发现redirect_uri的地址竟是http://localhost:1410 ,无语之极。之前根本没设过这个callback uri。什么时候偷偷设置的也不得而知。
于是我将这个地址粘到github application中的callback uri中,再次request token,终于成功跳转授权页面。
成功实现之后,返回来翻看了下代码,以及函数意义。发现例子中的github这个词是个坑。如果我没有理解错:
1.oauth_endpoints("github")中的github指的是github网站名。
endpoints函数返回网站的连接点信息。oauth_endpoints本身是一个常用网站连接点信息的结合,可以认为是一个dataset,存好了常用网站数据等你使用。
这里不会掺入redirect_uri的信息。甚至去掉这行代码,我也不觉得对功能实现有何影响。
2.myapp <- oauth_app("github", "56b637a5baffac62cad9")中的github其实是你注册的application的名字。比如我的app name是CleanData,所以我是oauth_app("CleanData","...").
起初我以为,我错在了第2点。因为刚开始我使用了github作为app name,而不是自己的CleanData。所以获取token的时候,callback uri的default值,来源于名叫github的application里设置的uri。为了验证想法,我重新更新了github网站上,App的callback uri=http://localhost:1234 ,同时代码改成:myapp<-oauth_app("CleanData","..my client id...")之后,get token依然出现mismatch的错误。用chrome自带抓包系统查看浏览器的request,发现依然是以localhost:1410为redirect uri。
手动更改浏览器的request,把1410换成1234跳转成功,点击授权。但是回头看Rgui,没有收到返回数据。
瞬间凌乱了。尼玛!这1410的localhost特么哪里跑出来的!
ps.回头看视频,appname居然是随便取,取github和取CleanData都一样,github只是说明这是一个github的app。damn!
pss.F**K! acesss github网页根本不需要注册应用,然后通过token访问。直接fromJSON(url)获取内容即可。