鉴于.net HttpClient在设计时考虑了重用,并且意图存在很长时间,并且在短期实例中报告了内存泄漏.在为多个用户调用端点时,您希望使用不同的承载令牌(或任何授权标头)对给定端点进行静默呼叫的指南行是什么?
private void CallEndpoint(string resourceId, string bearerToken) {
httpClient.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("bearer", bearerToken);
var response = await httpClient.GetAsync($"resource/{resourceid}");
}
Run Code Online (Sandbox Code Playgroud)
鉴于上述代码可以由Web应用程序上的任意数量的线程调用,第一行中设置的标头很可能与调用资源时使用的标头不同.
在不引起使用锁争用和维护无状态Web应用程序的情况下,为单个端点创建和部署HttpClients的建议方法是什么(我目前的做法是为每个端点创建一个客户端)?
生命周期
尽管HttpClient间接实现了IDisposable接口,但HttpClient的推荐用法并不是在每次请求后都将其处理掉.只要您的应用程序需要发出HTTP请求,HttpClient对象就会存在.在多个请求之间存在一个对象,可以设置一个用于设置DefaultRequestHeaders的地方,并且可以防止您在每次请求时重新指定CredentialCache和CookieContainer之类的内容,这是HttpWebRequest所必需的.
我正在开发一个主要通过应用程序访问的网站,我想使用OAuth2进行用户注册和身份验证.由于它是Android应用程序,我将开始使用Google的OAuth2内容,因为它在Android上提供了不错的用户界面.
Google表示,"您可以选择使用Google的身份验证系统作为外包用户身份验证的方式.这可以消除创建,维护和保护用户名和密码存储的需要." 这就是我想要做的.然而,当我浏览他们的所有示例和诸如此类的东西时,我只能找到有关网站或应用程序根据Google服务对用户进行身份验证的内容.
事实上,当我使用Google的OAuth2注册我的应用程序("客户端")时,网站客户端和"已安装"客户端(即移动应用程序)可以选择,但不能同时选择两者.我可以创建两个单独的客户端,但我读了OAuth2草案,我认为会有一个问题,我现在将解释.
以下是我设想的工作方式:

AccountManager类为Google的API请求访问令牌.AccountManager 使用手机上存储的凭据连接到Google的OAuth2服务器,并要求提供访问令牌.AccountManager 将访问令牌返回给MyApp.那我该怎么做呢?请不要说"使用OpenID"或"不要使用OAuth2"或其他类似无益的答案.哦,我真的想用漂亮的,以保持AccountManager用户界面,而不是糟糕的弹出WebView小号
来自Nikolay的临时答案(我会报告它是否有效!)它实际上应该有效,而Google的服务器并不关心访问令牌的来源.对我来说似乎有点不安全,但我会看看它是否有效!
我用Facebook而不是Google实现了这种模式,它完全有效.OAuth2服务器不关心访问令牌的来源.至少Facebook没有,所以我认为谷歌也没有.
鉴于此,存储访问令牌是一个非常糟糕的主意!但是我们也不想让Facebook/Google的服务器检查每个请求的身份验证,因为它会减慢一切.可能最好的办法是为您的站点添加一个额外的身份验证cookie,当您的访问令牌被验证时,您可以将其分发,但更简单的方法就是将访问令牌视为密码并存储其哈希值.你不需要加盐它,因为访问令牌真的很长.所以上面的步骤变成了:
9. MySite需要使用访问令牌验证用户.首先,它检查哈希有效访问令牌的缓存.如果在那里找到令牌的散列,则它知道用户已经过身份验证.否则,它会按照此处所述与Google进行核对- Google,"此令牌是否有效?".
10.如果Google说访问令牌无效,我们会告诉用户GTFO.否则谷歌说"是的,这是一个有效的用户",然后我们检查我们的注册用户数据库.如果找不到Google用户名(或Facebook id,如果使用Facebook),我们可以创建新用户.然后我们缓存访问令牌的散列值.
我尝试用正确的APP_ID,APP_SECRET等发送curl请求到
https://oauth.vk.com/access_token?client_id=APP_ID&client_secret=APP_SECRET&code=7a6fa4dff77a228eeda56603b8f53806c883f011c40b72630bb50df056f6479e52a&redirect_uri=REDIRECT_URI
Run Code Online (Sandbox Code Playgroud)
我需要从它获取access_token,但得到一个FALSE并curl_error()打印下一条消息,否则:
60: SSL certificate problem: self signed certificate in certificate chain
Run Code Online (Sandbox Code Playgroud)
我的代码是:
// create curl resource
$ch = curl_init();
// set url
curl_setopt($ch, CURLOPT_URL, $url);
//return the transfer as a string
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
// $output contains the output string
$output = curl_exec($ch);
if ( ! $output) {
print curl_errno($ch) .': '. curl_error($ch);
}
// close curl resource to free up system resources
curl_close($ch);
return $output;
Run Code Online (Sandbox Code Playgroud)
当我手动移动到上面的链接时,我得到了access_token.为什么它不适用于卷曲?请帮忙.
在CI服务器上,我想获取我们在Github上维护的配置文件,以便可以在许多作业之间共享.我试图通过curl获取此文件,但这些方法都失败了(我得到了404):
# As advised by the oAuth docs
curl -H 'Authorization: token the_token' -L -o setup.sh https://raw.github.com/org/repo/file
# The url of the raw file after clicking to view it
curl -L https://raw.github.com/org/repo/file?login=username&token=the_token
Run Code Online (Sandbox Code Playgroud) 我使用Android WebView for Twitter OAuth:Twitter要求用户登录并授权应用程序,我检索访问令牌并将其保留在我的应用程序中.
我不需要(也不要)存储用户密码,但WebView会保留Twitter的cookie,并且还会询问用户是否要记住密码.因此,即使在通过他的Twitter帐户页面取消授权应用程序并且我的应用程序销毁访问令牌之后,下次打开WebView时,它可能仍然登录,即使没有,它也有密码框已经填写.
如何强制WebView不要求记住密码,以及不保留会话cookie?如果那是不可能的,我可以删除它存储的所有状态(图像缓存除外)吗?
我正试图用一个React Native应用程序和一个单独的NodeJS/Express API后端来围绕oauth.我理解https://github.com/adamjmcgrath/react-native-simple-auth为React Native应用程序提供身份验证,http://passportjs.org/为NodeJS后端提供身份验证.我不确定如何连接这两个用于身份验证以便登录和访问API.
我希望用户通过电子邮件和密码或通过Facebook/Twitter/Google登录React Native应用程序.登录应用程序后,我应该向API发送什么以确保它们经过身份验证并可以访问特定路由?
以下是登录和查看登录用户设置的示例流程:
我正在创建一个Web应用程序,它将使用OpenID登录和OAout令牌与Youtube.我目前正在数据库中以纯文本格式存储OpenID标识和OAuth令牌/令牌密钥.
将这些值存储为纯文本是否不合适?我可以对OpenID标识符使用单向加密,但我不知道是否有必要.对于OAuth令牌,我需要使用双向加密,因为我的应用程序依赖于获取某些用途的会话令牌.
是否有必要加密OpenID身份?有人可以使用它来访问用户的帐户吗?
Android的AccountManager似乎为具有不同UID的应用程序获取相同的缓存身份验证令牌 - 这是安全的吗?它似乎与OAuth2不兼容,因为不应该在不同的客户端之间共享访问令牌.
I am building an Android app which uses OAuth2 for authentication/authorization of REST API requests to my server, which is an OAuth2 provider. Since the app is the "official" app (as opposed to a 3rd-party app), it is considered a trusted OAuth2 client, so I am using the resource owner password flow for obtaining an OAuth2 token: the user (the resource owner) enters his username/password into the app, which then sends its client ID and client …
我的 SPA 应用程序使用以下架构(来源):
这假设我的客户端应用程序知道刷新令牌,因为如果不存在用户凭据(例如电子邮件/密码),我需要它来请求新的访问令牌。
我的问题:我在哪里存储我的客户端应用程序中的刷新令牌?关于这个话题有很多关于 SO 的问题/答案,但关于刷新令牌,答案尚不清楚。
访问令牌和刷新令牌不应存储在本地/会话存储中,因为它们不是任何敏感数据的地方。因此,我会将访问令牌存储在httpOnlycookie 中(即使有 CSRF),无论如何,我对资源服务器的大多数请求都需要它。
但是刷新令牌呢?我不能将它存储在 cookie 中,因为 (1) 它会随着每个请求发送到我的资源服务器,这也使它容易受到 CSRF 的攻击和 (2) 它会发送暴露访问/刷新令牌与相同的攻击向量.
我能想到的解决方案有以下三种:
1) 将刷新令牌存储在内存中的 JavaScript 变量中,这有两个缺点:
尤其是后一个缺点会导致糟糕的用户体验。
2) 将访问令牌存储在会话存储中,并通过Bearer access_token授权标头将其发送到我的资源服务器。然后我可以使用httpOnlycookie 作为刷新令牌。这有一个我能想到的缺点:
3) 将两个令牌保存在httpOnlycookie 中,这具有上述缺点,即两个令牌都暴露于相同的攻击向量。
也许除了我提到的缺点之外还有另一种或更多的方式(请告诉我),但最终一切都归结为我将刷新令牌保存在客户端的什么位置?它是httpOnlycookie 还是内存中的 JS 变量?如果是前者,那么我应该把我的访问令牌放在哪里?
很高兴从熟悉该主题的人那里获得有关如何以最佳方式执行此操作的任何线索。
在Web API 2中,您曾经能够通过中间件设置OAuth授权服务器来创建端点以发出令牌,如下所示:
//Set up our auth server options.
var OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new SimpleAuthorizationServerProvider()
};
// Sets up the token issue endpoint using the options above
app.UseOAuthAuthorizationServer(OAuthServerOptions);
Run Code Online (Sandbox Code Playgroud)
也许我错过了它,但我想弄清楚如何在ASP.NET Core中做到这一点.我查看了源代码(https://github.com/aspnet/Security),但我真的没有看到类似的东西.有没有新的方法来实现这一目标?我是否需要创建一个控制器并自己完成?
我看到如何通过中间件设置OAuth身份验证,但这涉及我从API发出声明的授权部分.