我建议您阅读这篇文章作为Google API with OAuth2 的最佳起点,在您的情况下,您需要这个:OAuth2 for Devices。
可能您使用了错误的端点,要请求用户代码,您需要使用以下端点:
https://accounts.google.com/o/oauth2/device/code
这是一个使用 curl 的示例(在您的情况下授权访问 Google+ API):
curl https://accounts.google.com/o/oauth2/device/code -d "client_id=**your_client_id**" -d "scope=https://www.googleapis.com/auth/plus.me" -d "redirect_uri=urn:ietf:wg:oauth:2.0:oob"
你会得到这样的答案:
{
"device_code" : "4/AToZcyQ7U1BTV-xu4LAqpw02SgIW",
"user_code" : "bqsj67hb",
"verification_url" : "http://www.google.com/device",
"expires_in" : 1800,
"interval" : 5
}
然后您需要请求授权,向用户显示 user_code 和 verification_url 以将您的应用与用户的用户帐户“配对”。 Here there is a good example of this 或来自documentation:
在您的应用程序向用户显示 user_code 和 verification_url 后,您的应用程序可能会开始使用 device_code 轮询 Google 端点返回 user_code 和 verification_url。要轮询的端点的 URL 是https://accounts.google.com/o/oauth2/token,请求之间的时间间隔指定为以秒为单位的时间间隔。
最后一步,使用 curl 请求 access_token:
curl https://accounts.google.com/o/oauth2/token -d "client_id=**your_client_id**&client_secret=**your_client_secret**&code=**the _device_code_obtained_before**&grant_type=http://oauth.net/grant_type/device/1.0"
你会得到这样的回应:
{
"access_token" : "y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ",
"token_type" : "Bearer",
"expires_in" : 3600,
"id_token" : "eyJhbGciOiJSUzI1NiJ9.eyJpc3MiOiJhY2NvdW50cy5nb29nbGUuY29tIiwiYXVkIjoiNzgyMTM3OTUzMjkwLmFwcHMuZ29vZ2iLCJ0b2tlbl9oYXNoIjoiUUt0YmxTZUdsRUdNOVdPcUliRGR2QSIsImlhdCI6MTMzNDE3MDI1NywiZXhwIjoxMzM0MTc0MTU3fQ.Iz_Sv9X2fCydj4VfEdDxwWVH70DEK-rSzA5pWV9bvBdYB5VwgwFd8CSnotesDzJxq5pSKGwnAgvBfxSUbuGVmdET3E2sbrLODKymO9FoBzenfVooCwRXurzxvjKWF1EL3007lOPzTx9UGjqwShjjKQRoNjLFs-OmGCJsZGTHTGE",
"refresh_token" : "1/gjgpKUyppp223s43HMerTX-zS_2JUxQOCk"
}
最后,您可以使用获得的 access_token 访问您已授予的服务(不要忘记从 API 控制台配置访问权限,在您的情况下是 Google+ API)。
curl https://www.googleapis.com/plus/v1/people/me?access_token=y23r9.AHES6ZT78qJl14pTueruthfh5676TYDF234-Eme33iQ
关于问题
“应用程序似乎无法在 http://localhost url 上运行”。
答案是是的,这是预期的行为。此 redirect_uri 告诉您在成功授予应用权限后回调的位置。在您的情况下是移动设备。
对于 "urn:ietf:wg:oauth:2.0:oob",并不完全是重定向。您需要“抓住”或“钩住”它,以继续您的流程,可能是 this can help you 或 this。
祝你好运!