我是一名正在练习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。
代码如下所示,结果网址为:
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吗?
答案 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