如何在授权的重定向URL中使用谷歌Oauth2.0的快速发布方法

时间:2018-05-14 13:14:46

标签: rest express oauth-2.0

我是一名正在练习Google oauth2.0的人。我正在创建一个示例,但它不适用于Oauth身份验证。

首先,index.html中的操作如下。请求Oauth"请求令牌"使用href命令使用简单标记。

<a href="https://accounts.google.com/o/oauth2/v2/auth?
scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcalendar.readonly&access_type=offline&
include_granted_scopes=true&state=state_parameter_passthrough_value&redirect_uri=http%3A%2F%2Flocalhost%3A3000%2FreceiveCode&response_type=code&client_id=665922514832-f7n0s3chgn41vsojtg4gfl2j7c5a5lfr.apps.googleusercontent.com">Using google API
</a>
<form action='http://localhost:3000/user' method='get'>
    <button name="subject" type="submit" value='THIS 123!@# IS GET!!' href='www.google.com'>get</button>
</form>

此处的授权重定向URI为http:// localhost:3000 / receiveCode。

我想使用restful API而不是使用php文件。

它在这里工作得很好。问题是我登录Google网站后无法使用Scope。 根据Google参考文献https://developers.google.com/identity/protocols/OAuth2WebServer的第5步,

会话链接到授权重定向URI,然后将各种数据(如代码值)发送到POST以请求访问令牌

但是,在我设置为路由器的receiveCode中,它始终是GET。

代码如下所示,结果网址为:

http://localhost:3000/receiveCode?state=state_parameter_passthrough_value&code=4/AAAhDsl2wLidOA1Gqq9UzXbeWMe25sYx_8HtXx3_rGgeY9cm5mp2uSvdRBNqF6Da9ScEp0jE10mF_ibibEsM3x4&scope=https://www.googleapis.com/auth/calendar+https://www.googleapis.com/auth/calendar.readonly#

router.get('/receiveCode', (req, res, next) => {
    //NOT ERROR BUT NOT POST
})

router.post('/receiveCode', (req, res, next) => {
    // ERROR (Internal Server Error)
    // actually... never calling enter post method
})

我不确定这是结构问题还是使用post的API。

你不应该首先在快递中使用restAPI吗?

1 个答案:

答案 0 :(得分:0)

redirect_uri确定的资源确实应该通过HTTP GET方法检索,所以我认为到目前为止一切都按预期为你工作。

从这里开始,您应该能够从快速/receiveCode变量req property中检索处理params实施所需的查询参数,例如:

req.params.code

解释

我们如何知道GET是否正确?

在您查看实施示例之前,Google文档不是很清楚: https://developers.google.com/identity/protocols/OAuth2WebServer#example

如果你看看例如那里的Ruby示例(摘录如下),您可以看到回调/oauth2callback类似于您的/receiveCode,并且确实是通过GET实现的:

require 'google/apis/drive_v2'
require 'google/api_client/client_secrets'
require 'json'
require 'sinatra'

enable :sessions
set :session_secret, 'setme'

get '/' do
  unless session.has_key?(:credentials)
    redirect to('/oauth2callback')
  end
  client_opts = JSON.parse(session[:credentials])
  auth_client = Signet::OAuth2::Client.new(client_opts)
  drive = Google::Apis::DriveV2::DriveService.new
  files = drive.list_files(options: { authorization: auth_client })
  "<pre>#{JSON.pretty_generate(files.to_h)}</pre>"
end

get '/oauth2callback' do
  client_secrets = Google::APIClient::ClientSecrets.load
  auth_client = client_secrets.to_authorization
  auth_client.update!(
    :scope => 'https://www.googleapis.com/auth/drive.metadata.readonly',
    :redirect_uri => url('/oauth2callback'))
  if request['code'] == nil
    auth_uri = auth_client.authorization_uri.to_s
    redirect to(auth_uri)
  else
    auth_client.code = request['code']
    auth_client.fetch_access_token!
    auth_client.client_secret = nil
    session[:credentials] = auth_client.to_json
    redirect to('/')
  end
end

对于其他一些上下文,这里是Oauth 2规范的相应部分:

https://tools.ietf.org/html/rfc6749#section-4.1.2

https://tools.ietf.org/html/rfc6749#section-4.1.1

https://tools.ietf.org/html/rfc6749#section-3.1.2