Oauth 重定向 URL 不是动态的
Posted
技术标签:
【中文标题】Oauth 重定向 URL 不是动态的【英文标题】:Oauth redirection URL is not dynamic 【发布时间】:2021-04-16 03:04:51 【问题描述】:我的要求是我需要根据每个请求动态地授权谷歌用户使用 OAuth2 并以个性化的方式响应。
以下是我遵循的过程##标题##
在谷歌控制台中创建项目
通过以下方式创建 Oauth 客户端 ID
应用类型:网络
授权的 javascript 来源:http://localhost
授权重定向 URI:http://localhost:4000
下载为 client_request.json
以下是运行以下python代码后生成的URL,
https://accounts.google.com/o/oauth2/auth?client_id=123456789123-lkhipfqkk6g224bnf7n9sfdsdfsdss.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2F&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fgmail.settings.basic&access_type=offline&response_type=code
我们面临的问题是
生成的 URL 在我们无法单独处理每个请求的所有用户中都是相同的。
仅供参考:以下是python代码sn-p
'''
from apiclient import discovery
from googleapiclient.discovery import build
from googleapiclient import discovery
from httplib2 import Http
from oauth2client import file, client, tools
from oauth2client.tools import argparser, run_flow
args = argparser.parse_args()
from oauth2client.file import Storage
SCOPES = 'https://www.googleapis.com/auth/gmail.settings.basic'
STORAGE = Storage('credentials.storage')
credentials = STORAGE.get()
args.noauth_local_webserver = True
http = httplib2.Http()
if not creds or creds.invalid:
flow = client.flow_from_clientsecrets('client_secret.json', SCOPES)
creds = tools.run_flow(flow, STORAGE,http=http)
GMAIL = discovery.build('gmail', 'v1', http=creds.authorize(Http()))
addresses = GMAIL.users().settings().sendAs().list(userId='me',
fields='sendAs(isPrimary,sendAsEmail)').execute().get('sendAs')
for address in addresses:
if address.get('isPrimary'):
break
signature = 'signature':'<img src="https://server:4000/test.png" >'
rsp = GMAIL.users().settings().sendAs().patch(userId='me',
sendAsEmail=address['sendAsEmail'], body=signature).execute()
print("Signature changed to '%s'" % rsp['signature']) '''
【问题讨论】:
感谢 Daimto 编辑我的问题 我不是 100% 清楚你的问题是什么,或者你想要做什么。authorize google users using OAuth2 dynamically upon every request and respond in personalized way.
是什么意思?
【参考方案1】:
我认为您可能对 Oauth 的工作原理有所了解。
client_id 向 Google 识别您的应用程序 redirect_uri 您希望将授权数据返回到的文件位置。 限定您希望访问的授权范围 access_type 离线返回刷新令牌 response_type 这是一个 oauth 事情,基本上告诉 auth 服务器您期望什么响应。https://accounts.google.com/o/oauth2/auth?client_id=123456789123-lkhipfqkk6g224bnf7n9sfdsdfsdss.apps.googleusercontent.com&redirect_uri=http%3A%2F%2Flocalhost%3A4000%2F&scope=https%3A%2F%2Fwww .googleapis.com%2Fauth%2Fgmail.settings.basic&access_type=offline&response_type=code
上面的 URL 是您的应用程序的同意屏幕授权。此网址对所有用户都是相同的。
根据您的登录用户,应用程序将指定您有权访问的用户。
如何处理不同的用户登录
我开始怀疑你问错问题了。我怀疑您的问题与如何让多个用户登录并存储不同用户的凭据更相关。在这种情况下,您应该查看更接近此的代码。它将用户凭据存储到 token.pickle 中,然后再次加载它们。您当然必须更改它,以便存储不同用户的令牌,而不是像这段代码那样只存储一个用户。注意:我不是 python 开发人员,我只是在其他 google 示例项目之一中找到了此代码。
def main():
"""Shows basic usage of the Google Calendar API.
Prints the start and name of the next 10 events on the user's calendar.
"""
creds = None
# The file token.pickle stores the user's access and refresh tokens, and is
# created automatically when the authorization flow completes for the first
# time.
if os.path.exists('token.pickle'):
with open('token.pickle', 'rb') as token:
creds = pickle.load(token)
# If there are no (valid) credentials available, let the user log in.
if not creds or not creds.valid:
if creds and creds.expired and creds.refresh_token:
creds.refresh(Request())
else:
flow = InstalledAppFlow.from_client_secrets_file(
'credentials.json', SCOPES)
creds = flow.run_local_server(port=0)
# Save the credentials for the next run
with open('token.pickle', 'wb') as token:
pickle.dump(creds, token)
【讨论】:
@Datmto 让我们不要进入定义......让我们努力解决问题。使用仅限于授权的当前 Oauth 方法,会话处理可能还需要一些外部组件/api。我在大声思考 问题是 生成的 URL 在所有用户中都是相同的,我们无法单独处理每个请求。 正如我所解释的那样,应该是什么你会追求解决方案吗?您无法更改授权服务器的工作方式,尤其是您不拥有 Google 的授权服务器。以上是关于Oauth 重定向 URL 不是动态的的主要内容,如果未能解决你的问题,请参考以下文章
Oauth2 Instagram API“重定向 URI 与注册的重定向 URI 不匹配”
Google OAUTH:请求中的重定向URI与注册的重定向URI不匹配
出现错误:redirect_uri_mismatch 请求中的重定向 URI:http://localhost:8080/oauth2callback 与注册的重定向 URI 不匹配