Doorkeeper断言流中出现Invalid scope error(无效作用域错误)——Google OAuth登录实现的跟进问题
嗨,针对你这个Google OAuth登录的跟进问题,我来给你梳理下可能的原因和解决办法,咱们一步步排查:
首先,你碰到的「无效作用域错误」,大概率和这几个点有关:
作用域要前后完全一致:你在跳转到Google登录页发起授权请求时用的scope,必须和现在交换token时
google_oauth2_params里的scope完全匹配!比如授权时用了openid email profile,那交换token的参数里也得一模一样,多一个少一个或者拼写错半分都会触发错误。确认作用域是Google支持的:Google OAuth有明确的可用作用域列表,不能随便自定义。登录场景常用的就是
openid、email、profile这几个,要是你加了个官方没列的scope,肯定会报错。检查参数传递格式:你用的是
application/x-www-form-urlencoded格式,scope必须是用空格分隔的字符串,不能是数组哦!如果你的google_oauth2_params方法里返回的scope是数组,记得手动用join(' ')转成字符串,不然HTTParty可能会把它转成错误的格式发送给Google。
再看你的代码,我注意到google_oauth2_params里好像没显式包含scope参数?这很可能是问题所在!举个例子,你可以把这个方法调整成这样:
def google_oauth2_params(additional_params) base_params = { client_id: ENV["GOOGLE_CLIENT_ID"], redirect_uri: "你的回调地址", # 这里必须和Google控制台里配置的完全一致,包括http/https、路径细节! scope: "openid email profile" # 这里要和授权请求的scope完全匹配 } base_params.merge(additional_params) end
另外还要提醒一句:redirect_uri必须和Google开发者控制台里配置的丝毫不差,哪怕多了个末尾斜杠或者协议错了,也可能触发类似的错误(有时候错误提示会指向scope,但实际是参数不匹配)。
如果还是没解决,建议你打印出response.body看看具体的错误详情,Google的token接口会返回很明确的提示,比如告诉你哪个scope无效,这样就能精准定位啦~
备注:内容来源于stack exchange,提问作者Alexey Romanov

