我正在研究一个我们计划首先执行API的新项目,以便我们可以在其上实现Web和本机应用程序,并允许第三方集成.到目前为止所有相当标准.
我们还希望为API提供一整套自动化测试,以确保其无回归地工作,并确保其满足要求.同样,相当标准,但因为我们正在测试API,我们将使用代码内HTTP客户端而不是Web浏览器.
我们一直在寻找oauth2/OpenID Connect来促进API的身份验证和授权 - 基本上,客户端可以进行身份验证,获取访问令牌,然后使用它来访问所有API资源.
我正在努力解决的问题是让自动化测试与oauth2部分协同工作以实现调用API的好方法.第一个想法是使用"client_credentials"或"密码"授权类型,它们似乎都适用于我们想要的东西,但它们根本没有涵盖在OpenID Connect规范中,当然还有"密码" "无论如何,至少它通常不被认为是个好主意.
这是实现这一目标的最佳方式,还是有其他最佳实践可用于其他流程,但没有Web浏览器?
编辑:在(更多)阅读之后,我有了一个新的计划.完全脱机运行测试,使用针对单独数据库的单独部署,并在测试运行之前将数据直接播种到数据库中,然后使用标准OpenID Connect流,但使用:
然后,系统可以检测到这种事实组合,并自动验证提供的用户名,而无需通过浏览器.
这看起来合情合理吗?或者,还有更好的方法?
我尝试了多种方法从谷歌驱动器通过oauth和API下载文件,但是我无法下载文件.我相信我已经正确认证了.运行我的代码后,看起来下载文件成功(没有错误),但没有下载文件.
这是我到目前为止尝试的代码:
def download_file(file_id, mimeType):
if "google-apps" in mimeType:
return
request = drive_service.files().get(fileId=file_id)
fh = io.BytesIO()
downloader = MediaIoBaseDownload(fh, request)
done = False
while done is False:
status, done = downloader.next_chunk()
print "Download %d%%." % int(status.progress() * 100)
Run Code Online (Sandbox Code Playgroud)
但是,这会导致"下载100%".被打印到控制台,但没有下载文件.
我也尝试过:
def download2(download_url):
resp, content = drive_service._http.request(download_url)
if resp.status == 200:
print 'Status: %s' % resp
return content
else:
print 'An error occurred: %s' % resp
return None
Run Code Online (Sandbox Code Playgroud)
这也不会产生下载的文件,但它确实给了我200条消息.
这两个似乎都正确地与API联系.我需要做一些额外的步骤来实际获取计算机上的文件吗?
编辑:
这是我的代码的其余部分:
import json
import webbrowser
import httplib2
import io
from …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用该yarn self-update命令来查看它是如何工作的,但它不会更新Yarn版本,而是抛出OAuth错误,如此
yarn self-update
yarn self-update v0.15.1
error OAuth2 authentication requires a token or key & secret to be set
at __dirname.authenticate (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/node_modules/github/lib/index.js:334:23)
at Object.<anonymous> (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/lib/cli/commands/self-update.js:30:12)
at next (native)
at step (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:17:30)
at /Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:35:14
at new Promise (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/node_modules/core-js/library/modules/es6.promise.js:191:7)
at Object.<anonymous> (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/node_modules/babel-runtime/helpers/asyncToGenerator.js:14:12)
at Object.run (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/lib/cli/commands/self-update.js:99:17)
at run (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/lib/cli/index.js:237:18)
at config.init.then (/Users/nikjohn/.nvm/versions/node/v6.4.0/lib/node_modules/yarn/lib/cli/index.js:345:12)
info Visit http://yarnpkg.com/en/docs/cli/self-update for documentation about this command.
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么会这样做以及需要做些什么才能解决这个问题?根据这里的文档,这个命令没有任何这样的OAuth依赖和恕我直言,它也不应该.
看起来这里已有PR了
编辑:进一步的研究表明,这是纱线的一个已知错误.但仍无法解决问题.如果修复程序作为新版本推出,那将是一个奇怪的catch22,但是由于命令失败,用户无法更新.一种可能的解决方案是yarn self-update [tag]代替yarn self-update,但这仍然是一个错误.*
编辑: …
我正在尝试针对at_hash验证访问令牌.令牌标题是这样的
{
"typ": "JWT",
"alg": "RS256",
"x5t": "MclQ7Vmu-1e5_rvdSfBShLe82eY",
"kid": "MclQ7Vmu-1e5_rvdSfBShLe82eY"
}
如何从访问令牌获取id标记中的Base64编码的at_hash声明值?是否有可以帮助我的在线工具?SHA256哈希计算器不是一个正确的工具吗?
谢谢
所以我有一个登录Instagram的网络应用程序.工作好几个月.没有代码改变,突然间我得到了
{"code": 400, "error_type": "OAuthException", "error_message": "Matching code was not found or was already used."}
Run Code Online (Sandbox Code Playgroud)
在我的浏览器上登出instagram.com并使用我的网络应用程序登录instagram oauth ....现在可行.它反复运行(使用instagram oauth登录和注销我的应用程序).工作良好.
直到我在浏览器上访问www.instagram.com网页.然后我的oauth登录再次失败并出现同样的错误.在我退出instagram.com本身之前,我无法再次使用Instagram oauth登录我的网络应用程序
GoogleAuthUtil.getToken要求它的第二个参数是帐户对象,但是当您使用Google SignIn连接时,结果中的结果是GoogleSignInAccount - 这不是一回事.有没有办法将GoogleSignInAccount转换为Account对象?
private void handleSignInResult(GoogleSignInResult result) {
if (result.isSuccess()) {
googleSignInAccount = result.getSignInAccount();
}
}
Run Code Online (Sandbox Code Playgroud)
然后:
authToken = GoogleAuthUtil.getToken(context, [need an account here], scope);
Run Code Online (Sandbox Code Playgroud)
我知道我可以通过显示accountpicker来获取电子邮件地址,我也可以从google登录结果中获取电子邮件地址 - 但我看不到获取整个帐户对象的方法.
android google-authentication google-signin googlesigninaccount oauth2
我想在浏览器中存储oauth刷新令牌.我想将它存储在那里的原因是应用程序可以刷新访问令牌并让用户不间断地继续他们的会话.我还想消除服务器上存储令牌的任何缓存的需要,从而使其成为有状态的.
我被告知在浏览器中存储刷新令牌是错误的,因为它不安全.
我认为没关系,因为:
我认为它应该没问题我错了吗?请解释原因!
security authentication web-applications oauth2 refresh-token
隐含流动被认为是不安全的.我知道两个问题:
它看起来并不太糟糕.是否还有其他我不知道的安全漏洞?
我在看的oauth2规格,我迷茫unauthorized_client和access_denied错误代码。它们似乎表达了相同的错误条件,不是吗?乍一看(通过错误代码),我认为一个是身份验证失败,另一个是授权失败,但它们实际上都是关于授权失败,这将转换为 http 403 状态代码。
unauthorized_client
The client is not authorized to request an access token
using this method.
access_denied
The resource owner or authorization server denied the
request.
Run Code Online (Sandbox Code Playgroud) 在Cookie中存储OAuth 2令牌是不是很糟糕?如果是这样,什么是Web应用程序的替代品?