小编dde*_*ele的帖子

如何保持OAuth消费者的安全,以及如何在受到损害时做出反应?

这个问题是关于尝试了解在Android等移动平台上实现oauth所涉及的安全风险.这里假设我们有一个Android应用程序,其中包含嵌入在代码中的消费者密钥/秘密.

假设一个消费者的秘密受到了损害,并且黑客已经掌握了它,这会带来什么后果?

妥协的消费者秘密假设
我正确地指出,受损的消费者秘密对用户的安全性或用户正在与之交互的OAuth启用的提供商中存储的任何数据没有影响.数据本身不受损害,黑客无法检索.

黑客需要获得一个有效的用户访问令牌,这是很难得到的.

一个黑客可以用一个妥协的消费者秘密做什么?
我在说明以下内容时也是正确的:

  • 黑客可以设置/发布模仿我的应用程序的应用程序.
  • 黑客可以吸引将通过OAuth流程的用户,通过黑客OAuth舞蹈(使用受损的消费者密钥/秘密)检索访问令牌.
  • 用户可能认为他正在处理我的应用程序,因为他将在授权过程中看到熟悉的名称(使用者密钥).
  • 当消费者通过黑客发出请求时,黑客可以轻松拦截访问令牌,并且与消费者秘密相结合,现在可以代表我签署请求以获取对我的资源的访问权限.

最终用户的影响
在假设中

  • 黑客使用我的消费者秘密设置了一个应用程序/站点
  • 我的一个用户被欺骗授权访问该应用程序/站点

可能发生以下情况:

  • 最终用户可能会注意到一些可疑的东西,并通知服务提供商(例如谷歌)有关恶意应用程序的信息
  • 然后,服务提供商可以撤销消费者密钥/秘密

OAuth使用者(我的应用程序)影响:
我的应用程序(包含消费者秘密)需要更新,否则我的所有客户都无法授权我的应用程序代表他们做请求(因为我的消费者秘密将不再是有效的).

委派所有OAuth流量
尽管可以通过中间网络服务器委派大量OAuth交互(进行OAuth舞蹈并将访问令牌发送给用户),但也必须代理所有服务交互,作为消费者密钥签署每个请求需要/ secret.这是将消费者密钥/秘密保留在移动应用程序之外,并存储在中间网络服务器上更安全的地方的唯一方法吗?

替代
方案此代理有替代方案吗?是否可以将消费者秘密存储在中间网络服务器上,并且具有某种机制,即Android应用程序(在市场上发布并正确签名)可以向中间网络服务器发出安全请求以获取消费者秘密并存储它应用程序内部?可以实现一种机制,中间网络服务器"知道"这是一个请求获取消费者秘密的官方Android应用程序,并且中间网络服务器只会将消费者秘密分发给该特定的Android应用程序吗?

security android oauth

75
推荐指数
1
解决办法
9794
查看次数

EmberJS - 为不同的路线共享控制器/模板

我有一个非常简单的CRUD应用程序,允许创建新对象以及编辑它们.

用于添加记录和编辑记录的模板几乎相同.

他们使用完全相同的表单元素.唯一的区别是表单下面的标题和按钮(应该更新或创建记录)

在我的实施中,我有

  • 2路线定义
  • 2个路线对象
  • 2个控制器对象
  • 2个模板

我想知道是否

  • 我不能在这里推广再利用
  • 如果所有这些对象都是必需的.

困扰我的是什么:

  • 我有2个单独的模板用于创建和编辑(虽然它们几乎相同)
  • 我有两个独立的控制器完全相同的事情.

我希望在控制器级别上解决这个问题.当控制器装饰模型时,在我的情况下,单个控制器对象可以包装新记录或现有记录.然后它可以公开一个属性(isNewObject),以便模板可以决定我们是在"新"还是"编辑"流程中.控制器可以有一个createOrUpdate方法,该方法newupdate场景中和场景中都可以使用.

路线

当前实现正在为我的资源使用新的和编辑路由.

this.resource("locations", function(){
  this.route("new", {path:"/new"});
  this.route("edit", {path: "/:location_id" });
});
Run Code Online (Sandbox Code Playgroud)

新的路线

new route负责创建一个新的记录,当用户导航到新的记录画面被调用.

App.LocationsNewRoute = Ember.Route.extend({
  model: function() {
    return App.Location.createRecord();
  }
});
Run Code Online (Sandbox Code Playgroud)

编辑路线

edit route负责当用户点击在概览屏幕编辑按钮编辑现有对象.我没有扩展默认编辑路线,而是使用自动生成的路由.

控制器

newedit控制器负责处理发生在模板中的动作(选择保存或者更新记录)

两个控制器唯一做的就是提交事务.

注意:我想这是重复使用的候选者,但是如何使用单个控制器来驱动2个不同的路由/模板?

App.LocationsNewController = Ember.ObjectController.extend({
  addItem: function(location) {
    location.transaction.commit();
    this.get("target").transitionTo("locations");
  }
});

App.LocationsEditController = Ember.ObjectController.extend({
  updateItem: function(location) {
    location.transaction.commit();
    this.get("target").transitionTo("locations");
  }
});
Run Code Online (Sandbox Code Playgroud)

模板: …

ember.js

31
推荐指数
1
解决办法
9070
查看次数

docker运行java进程消耗的额外内存不明原因

我们有什么 :

  • 在docker容器中运行的Java应用程序
  • 没有调用本机代码,没有处理启动,没有引用DLL/.so文件.
  • JVM args: -Xmx256m -XX:NativeMemoryTracking=summary
  • Docker硬内存限制设置为 768m
  • JVM似乎正常(正常的GC循环,没有内存泄漏,没有OOM)
  • Docker内存不断增长,直到达到硬限制(768m),导致杀死并重新启动容器.

问题 :

  • 为什么Docker统计数据内存不断增长(导致每天都会遇到硬内存限制),尽管JVM似乎表现在其极限范围内.

在此输入图像描述

  • 使用其他微服务,我们看不到这种行为

在此输入图像描述

JVM

在JVM方面,我们没有注意到任何特殊的东西:

在此输入图像描述

Docker统计输出:

492.8MiB / 768MiB     64.17%              

[ec2-user@ip-10-180-28-222 ~]$ docker exec 34d7 jcmd 1 VM.native_memory summary
1:

Native Memory Tracking:

Total: reserved=1731355KB, committed=472227KB
-                 Java Heap (reserved=262144KB, committed=262144KB)
                            (mmap: reserved=262144KB, committed=262144KB)

-                     Class (reserved=1131805KB, committed=92829KB)
                            (classes #16224)
                            (malloc=7453KB #20996)
                            (mmap: reserved=1124352KB, committed=85376KB)

-                    Thread (reserved=29932KB, committed=29932KB)
                            (thread #30)
                            (stack: reserved=29772KB, committed=29772KB)
                            (malloc=94KB #151)
                            (arena=66KB #55)

-                      Code (reserved=255659KB, committed=35507KB)
                            (malloc=6059KB #9814)
                            (mmap: …
Run Code Online (Sandbox Code Playgroud)

java memory docker

14
推荐指数
1
解决办法
1039
查看次数

在Android应用中集成"搜索地图"功能

Google地图应用程序具有搜索框(带有自动提示),可让您搜索地址,从而将标记放置在Google地图应用程序的地图上.

是否可以在自定义Android应用程序中重复使用此功能,其中还会显示文本框,从而将Geopoint传递到自定义应用程序,以便应用程序本身可以将标记放置在某个位置?换句话说,Google Maps应用程序是否公开了可以由自定义应用程序使用的服务或意图?

如果是这样,如何进行这种整合?

如果没有,有人可以提供一个关于如何实现自定义实现的指针吗?

android google-maps

11
推荐指数
1
解决办法
5416
查看次数

GitFlow中的Maven版本控制

Git Flow已经存在了很长时间,很多人似乎都把它作为他们最喜欢的git工作流程.

当谈到在Java/Maven环境中实现Git Flow时,我想知道如何对下面所有分支上的软件模块进行版本控制.

在此输入图像描述

在简单的Maven世界中,

  • 开发人员总是使用SNAPSHOT版本(例如:0.0.1-SNAPSHOT)
  • 一些发布过程创建一个发布(0.0.1)
  • 新的快照版本可供开发人员开发(0.0.2-SNAPSHOT).

如果您拥有的只是一个Develop和Master分支,那就没关系,但是如何在GitFlow中处理maven版本控制.

master上的版本很容易定义,因为它们将是最终从Release分支创建和发布的版本.

但是一旦代码进入发布分支,您在此处部署了什么版本控制策略?

  • 我想我们需要在发布分支上保留一个新版本号以避免与Develop冲突?那个版本号将如何与开发分支上的任何内容相关联.
  • 我假设在发布分支上,在发布进入生产之前还可以有多个提交.由于我们无法重复使用非快照版本,我们是否会在每次提交时增加固定版本,或者在最终确定并推送到master之前使用版本快照版本?
  • 当我们将更改从发布版本合并到开发分支时,我们是否会启动新的快照版本?

java git maven git-flow

10
推荐指数
1
解决办法
2236
查看次数

允许用户使用其Google凭据访问您的应用的最佳方式

如果您的Android应用程序需要用户注册,并且您希望允许您的用户通过Google登录,那么您将如何处理?

我想在此处继续讨论Google+登录.我们也没有使用用户凭据访问Google API,我对Google+的社交功能的其他访问权限不感兴趣.

似乎有很多选择:

使用OAuth2.0进行身份验证

Google OAUth2登录页面中记录

这并没有真正提到Android,但它(部分)基于OAuth2访问令牌,但更重要的是基于JSON Web令牌id_token的验证.

这种对用户进行身份验证的方法还包括启动WebView以允许用户登录其Google帐户以及相当复杂的id_token验证.

使用OAuth2/Google Play服务

Google Play服务中的一个示例更侧重于授权.它使用GoogleAuthUtil.getToken来检索access_token.它的一部分肯定是身份验证,因为对话框指出"登录到...".

在此输入图像描述

我是否正确地认为使用带有access_token的OAuth2.0流作为身份验证机制是一种不好的做法?(将访问令牌存储为身份验证令牌).

支持Facebook/Twitter登录

我问的原因是因为Twitter和Facebook建议您实施"登录..."身份验证过程

这似乎也完全基于OAuth访问令牌.

我不知道的任何其他选项允许您使用他们的Google帐户验证用户?

security authentication android oauth-2.0 google-oauth

7
推荐指数
1
解决办法
3663
查看次数

代理超时/客户端断开连接时的Paho MQTT客户端行为

我有许多QoS2级别的消息,这些消息在MQTT代理或客户端出现问题时导致问题.这些问题可能包括

  • 客户端开始查看服务器超时
  • 客户端已经失去与代理的连接(互联网连接断开,与经纪人发生问题,......)一段时间并重新连接.

通常,当MQTT客户端开始从代理接收超时或其他错误时,消息将存储在持久性存储中(正在进行的消息),并最终将重新发布.

但是,如果Paho客户端失去与代理的连接,则不会再在飞行中考虑消息,Paho也不会存储消息.此时,似乎应用程序负责持久保存这些消息(在paho之外)并重新发布它们.

我是否正确地说,当MQTT代理变得不可用时,Paho MQTT客户端无法帮助我保证这些QoS2级别的消息将被重新传递?

那么我如何区分以下情况,其中client.publish导致了一个MqttException,其中Paho没有持久化消息.

Client is currently disconnecting (32102)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms.shutdownConnection(ClientComms.java:297)
    at org.eclipse.paho.client.mqttv3.internal.CommsSender.handleRunException(CommsSender.java:154)
    at org.eclipse.paho.client.mqttv3.internal.CommsSender.run(CommsSender.java:131)
    at java.lang.Thread.run(Thread.java:745)
Run Code Online (Sandbox Code Playgroud)

以下它确实持续存在

Timed out waiting for a response from the server (32000)
    at org.eclipse.paho.client.mqttv3.internal.Token.waitForCompletion(Token.java:94)
    at org.eclipse.paho.client.mqttv3.MqttToken.waitForCompletion(MqttToken.java:50)
    at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:315)
    at org.eclipse.paho.client.mqttv3.MqttClient.publish(MqttClient.java:307)
Run Code Online (Sandbox Code Playgroud)

显然,我也可以开始记账并单独保留所有失败的消息,但随后我可能最终得到QoS等级2重复(由Paho和我自己重新发布的消息).

如何对客户进行编程?

  • 是否需要根据异常代码与Paho一起做我自己的消息持久性?
  • 我是否需要考虑connectionLost回调并假设从那时起,Paho将不会在MQTT客户端重新连接之前为我保留任何内容?
  • 在发布之前,我需要检查客户端是否正确连接,如果是这样,假设Paho将保留消息?

以下是Paho的一些例外和持久性行为

  • 连接丢失(32109):消息由paho持久存在
  • 客户端当前正在断开连接(32102):paho丢失了消息
  • 超时等待来自服务器的响应(32000):消息是持久的paho
  • 客户端未连接(32104):paho丢失了消息

Paho的一些最佳实践是什么?

mqtt paho

7
推荐指数
1
解决办法
8514
查看次数

为什么这个Oracle DROP COLUMN会改变另一列的默认值?

我们在Oracle数据库中的表上有一种奇怪的情况,其中删除列会导致更改另一列的默认值.这是场景.

我的表中有一些示例数据:

select * from SAMPLE_TABLE ;

ID                                       BUSINESS_KEY
---------------------------------------- ---------------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb                   1
c0dabf78-d9ca-4072-832e-aeb618c7ed14                   2
Run Code Online (Sandbox Code Playgroud)

我添加了一个带有检查约束(TYPE1_VAL1TYPE1_VAL2)的列TYPE1和一个默认值TYPE1_VAL2:

alter table SAMPLE_TABLE add TYPE1 varchar(10) default 'TYPE1_VAL2' not null check(TYPE1 in ('TYPE1_VAL1', 'TYPE1_VAL2'));

Table altered.
Run Code Online (Sandbox Code Playgroud)

我看到正确填写了默认值(TYPE1_VAL2):

select * from SAMPLE_TABLE ;

ID                                       BUSINESS_KEY    TYPE1
---------------------------------------- --------------- ----------
e59bf31c-49a4-4638-bf6e-7d1be60f4dbb                   1 TYPE1_VAL2
c0dabf78-d9ca-4072-832e-aeb618c7ed14                   2 TYPE1_VAL2
Run Code Online (Sandbox Code Playgroud)

我添加另一个列TYPE2与另一个检查约束(TYPE2_VAL1TYPE2_VAL2)和默认值TYPE2_VAL2:

alter table SAMPLE_TABLE add TYPE2 varchar(15) default 'TYPE2_VAL2' not null check(TYPE2 in ('TYPE2_VAL1', …
Run Code Online (Sandbox Code Playgroud)

sql oracle ddl check-constraints oracle11g

6
推荐指数
1
解决办法
1026
查看次数

如何在外部邮件模板中为 Keycloak 用户更新配置文件生成和使用登录操作令牌

我们的后端当前正在使用 KeyCloak 管理客户端 API (Java)

\n
    \n
  • 创建用户
  • \n
  • 创建角色
  • \n
  • 为用户分配角色
  • \n
  • 执行操作电子邮件(\xe2\x80\x9cUPDATE_PASSWORD\xe2\x80\x9d、\xe2\x80\x9cUPDATE_PROFILE\xe2\x80\x9d、\xe2\x80\x9cVERIFY_EMAIL\xe2\x80\x9d)
  • \n
\n

然而,我们的流程需要支持以下场景:

\n
    \n
  • 我们希望使用外部电子邮件服务/模板来发送这些邮件,而不是使用executeActionsEmailAPI 调用并让 Keycloak 向用户发送电子邮件以供他们完成个人资料
  • \n
  • 当 Keycloak 发送UPDATE_PROFILE电子邮件时,它包含/login-actions/action-token?key=eyJhbG\xe2\x80\xa6带有操作令牌的链接。
  • \n
  • 我们想将此链接嵌入到我们自己的电子邮件模板中(在 keycloak 之外)
  • \n
\n

所以问题是我是否可以使用 KeyCloak API(或其他一些机制)为 keycloak 领域内的用户生成登录操作 URL,然后我们可以在外部电子邮件模板中使用该 URL 来发送完整的注册电子邮件?

\n

user-management keycloak keycloak-rest-api

6
推荐指数
1
解决办法
3572
查看次数

为什么我的Android SQLite数据库突然崩溃了?

突然间,我的应用程序正在使用的数据库似乎已经损坏了.我没有改变数据库的结构,但我今天在我的设备上多次重新部署了应用程序.

它抛出以下异常.

E/Database(14281): CREATE TABLE android_metadata failed err=26 ..
E/Database(14281): Failed to setLocale() when constructing, closing the database
E/Database(14281): android.database.sqlite.SQLiteException: file is encrypted or is not  a database
E/Database(14281):  at android.database.sqlite.SQLiteDatabase.native_setLocale(Native  Method)
E/Database(14281):  at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1848)
E/Database(14281):  at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1798)
E/Database(14281):  at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:798)
E/Database(14281):  at   android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:857)
E/Database(14281):  at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:850)
E/Database(14281):  at android.app.ApplicationContext.openOrCreateDatabase(ApplicationContext.java:539)
E/Database(14281):  at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:193)
E/Database(14281):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:98)
E/Database(14281):  at com.ecs.android.gps.storage.DBAdapter.open(DBAdapter.java:75)
Run Code Online (Sandbox Code Playgroud)

使用SQLLiteOpenHelper类初始化数据库.

public DBAdapter(Context ctx) 
{
    this.context = ctx;
    DBHelper = new DatabaseHelper(context);
}

private static class DatabaseHelper extends SQLiteOpenHelper 
{
    DatabaseHelper(Context …
Run Code Online (Sandbox Code Playgroud)

database sqlite android

5
推荐指数
1
解决办法
4499
查看次数

在Android上使用OAuth 2.0使用Google API的最佳方式

我正在尝试使用OAuth 1.0a将Android应用程序迁移到OAuth 2.0.(根据我的OAuth 2.0需要使用适用于Java/Android的Google API客户端库).

在Android平台上使用OAuth 2.0访问Google API的最佳/首选解决方案是什么,同时考虑了可用性方面.用户应该能够以简单的方式自动化访问,与我的Android应用程序无缝集成.

该应用程序当前正在使用OAuth 1.0基于Web的流程,我的应用程序弹出浏览器以允许用户授权访问,并且使用自定义重定向URI,我的应用程序能够检索访问令牌.它工作得很好,但我不喜欢这样的事实,我需要离开我的应用程序才能弹出一个浏览器来显示一个网页.我当时认为OAuth 2.0可以解决这个问题,并提供更好的用户体验.

我开始关注Google IO中概述Adroid AccountManager-OAuth2集成,因为它不涉及webbrowser,并且与Android更紧密地结合,但它根本不按预期的方式运行.它没有记录,也不清楚它是否仍然是未来可行的选择.

我现在开始研究标准的OAuth 2.0 Web流程.

在这里,我似乎有两个选择:

将OAuth 2.0客户端配置为已安装的应用程序,并使用urn:ietf:wg:oauth:2.0:oob重定向URI.

不是很干净的解决方案,因为我不会让我的用户将一些代码复制粘贴到我的应用程序中.这根本不是用户友好的.

使用OAuth 2.0访问谷歌的API文档提到,有投票的某种方式的页面解析出URL的冠军,但我也看到了很多与可用性问题,并没有真正想写这种管道代码.如果存在可以为我做的那个客户端库,我会很乐意进一步调查,但是现在,我已经放弃了这个选项.

将OAuth 2.0客户端配置为webapp,并使用重定向URI.

在这里,我注意到OAuth 2.0中禁止使用非标准方案.以前,可以使用类似xoauth://回调的东西,但不再允许这样做.在配置像http://mysite.com/oauth2/callback这样的重定向URI时,我无法在Google OAuth 2.0页面重定向时打开我的活动,尽管已为其设置了正确的意图过滤器.该http://mysite.com/oauth2/callback简单地显示在浏览器中.

以下工作正常

Intent i = new Intent(Intent.ACTION_VIEW,Uri.parse("http://mysite.com/oauth2/callback"));
startActivity(i);
Run Code Online (Sandbox Code Playgroud)

但是,当Google OAuth 2页面重定向到同一个网址时,它只会显示在浏览器中.

即使这样可行,用户仍会看到一个选择器弹出窗口(在浏览器中打开或使用我的Android Activity打开).从可用性的角度来看,这也是不可接受的.

我正在寻找比这里概述的解决方案更好的解决方案.

此致,戴维

android oauth-2.0 google-api-java-client

5
推荐指数
1
解决办法
1万
查看次数

带有Zuul代理的Spring Security Oauth2 SSO

我正在修改来自Springs优秀安全教程oauth2-vanilla样本.oauth2-vanilla将Zuul Proxy和UI组合到一个应用程序中.我想分开Zuul代理和UI.(Zuul代理应充当API网关和多个UI的反向代理).

当通过zuul代理访问UI时,它应该能够在UI和资源后端之间基于Oauth2进行SSO.

oauth2-vanilla看起来像这样

我想转向这样的地方:

我已经从网关中删除了UI部分,并为ui添加了一个zuul路由

@EnableOAuth2Sso

我创建了一个新的UI webapp,其中包含带有/user注释的UI(Angular stuff).

所以我通过http:// localhost:8888(通过zuul代理)访问UI .在验证并完成UI流程后,我可以访问返回给用户的/ user端点.(在调试期间,我看到当我访问/ user端点时,我有一个带有OAuth2Authentication的HTTP会话.

但是,当我访问/ resource端点时,HttpSessionSecurityContextRepository无法找到会话,也无法使用OAuth2Authentication构建上下文.

我用修改后的样本创建了一个git存储库.

我猜测网关配置有问题.我已经尝试更改cookie路径,更改代理中的HttpSecurity规则,但我无法让它工作.

我不明白的是,为什么UI通过代理访问时能够/resource很好地解析端点(使用HTTP会话和OAuth2Authentication),但无法访问/ui端点.

此外,由于UI现在在@EnableOAuth2Sso上下文中运行,似乎我需要在网关中使用以下代码来加载角度css/js文件.

/user

我需要用zuul ui路由作为前缀,这似乎也不对.

任何帮助,将不胜感激.

spring spring-security spring-security-oauth2 spring-cloud

5
推荐指数
1
解决办法
5754
查看次数

群负载均衡是否应该对其节点执行健康检查?

swarm 文档中的负载平衡部分没有明确说明内部负载平衡器是否也进行健康检查,以及它是否删除了不再运行服务的节点(因为它被杀死或节点被重新启动)。

在以下情况下,我有一个服务,副本为 3,在 3 个节点中的每个节点上运行 1 个实例。

经理:

[root@centosvm ~]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
a593d485050a        ddewaele/springboot.crud.sample:latest   "sh -c 'java $JAVA_OP"   7 minutes ago       Up 7 minutes                            springbootcrudsample.1.5syc6j4c8i3bnerdqq4e1yelm
Run Code Online (Sandbox Code Playgroud)

节点 1:

[root@node1 ~]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
d3b3fbc0f2c5        ddewaele/springboot.crud.sample:latest   "sh -c 'java $JAVA_OP"   4 minutes ago       Up 4 minutes                            springbootcrudsample.3.7y1oyjyrifgkmxlr20oai5ppl
Run Code Online (Sandbox Code Playgroud)

节点 2:

[root@node2 ~]# docker ps
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS               NAMES
ebca8f24ec3a        ddewaele/springboot.crud.sample:latest   "sh …
Run Code Online (Sandbox Code Playgroud)

load-balancing docker docker-swarm

3
推荐指数
1
解决办法
1092
查看次数