这个问题是关于尝试了解在Android等移动平台上实现oauth所涉及的安全风险.这里假设我们有一个Android应用程序,其中包含嵌入在代码中的消费者密钥/秘密.
假设一个消费者的秘密受到了损害,并且黑客已经掌握了它,这会带来什么后果?
妥协的消费者秘密假设
我正确地指出,受损的消费者秘密对用户的安全性或用户正在与之交互的OAuth启用的提供商中存储的任何数据没有影响.数据本身不受损害,黑客无法检索.
黑客需要获得一个有效的用户访问令牌,这是很难得到的.
一个黑客可以用一个妥协的消费者秘密做什么?
我在说明以下内容时也是正确的:
最终用户的影响
在假设中
可能发生以下情况:
OAuth使用者(我的应用程序)影响:
我的应用程序(包含消费者秘密)需要更新,否则我的所有客户都无法授权我的应用程序代表他们做请求(因为我的消费者秘密将不再是有效的).
委派所有OAuth流量
尽管可以通过中间网络服务器委派大量OAuth交互(进行OAuth舞蹈并将访问令牌发送给用户),但也必须代理所有服务交互,作为消费者密钥签署每个请求需要/ secret.这是将消费者密钥/秘密保留在移动应用程序之外,并存储在中间网络服务器上更安全的地方的唯一方法吗?
替代
方案此代理有替代方案吗?是否可以将消费者秘密存储在中间网络服务器上,并且具有某种机制,即Android应用程序(在市场上发布并正确签名)可以向中间网络服务器发出安全请求以获取消费者秘密并存储它应用程序内部?可以实现一种机制,中间网络服务器"知道"这是一个请求获取消费者秘密的官方Android应用程序,并且中间网络服务器只会将消费者秘密分发给该特定的Android应用程序吗?
我有一个非常简单的CRUD应用程序,允许创建新对象以及编辑它们.
用于添加记录和编辑记录的模板几乎相同.
他们使用完全相同的表单元素.唯一的区别是表单下面的标题和按钮(应该更新或创建记录)
在我的实施中,我有
我想知道是否
困扰我的是什么:
我希望在控制器级别上解决这个问题.当控制器装饰模型时,在我的情况下,单个控制器对象可以包装新记录或现有记录.然后它可以公开一个属性(isNewObject),以便模板可以决定我们是在"新"还是"编辑"流程中.控制器可以有一个createOrUpdate方法,该方法new在update场景中和场景中都可以使用.
当前实现正在为我的资源使用新的和编辑路由.
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负责当用户点击在概览屏幕编辑按钮编辑现有对象.我没有扩展默认编辑路线,而是使用自动生成的路由.
在new与edit控制器负责处理发生在模板中的动作(选择保存或者更新记录)
两个控制器唯一做的就是提交事务.
注意:我想这是重复使用的候选者,但是如何使用单个控制器来驱动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)
-Xmx256m -XX:NativeMemoryTracking=summary768m768m),导致杀死并重新启动容器.在JVM方面,我们没有注意到任何特殊的东西:
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) Google地图应用程序具有搜索框(带有自动提示),可让您搜索地址,从而将标记放置在Google地图应用程序的地图上.
是否可以在自定义Android应用程序中重复使用此功能,其中还会显示文本框,从而将Geopoint传递到自定义应用程序,以便应用程序本身可以将标记放置在某个位置?换句话说,Google Maps应用程序是否公开了可以由自定义应用程序使用的服务或意图?
如果是这样,如何进行这种整合?
如果没有,有人可以提供一个关于如何实现自定义实现的指针吗?
Git Flow已经存在了很长时间,很多人似乎都把它作为他们最喜欢的git工作流程.
当谈到在Java/Maven环境中实现Git Flow时,我想知道如何对下面所有分支上的软件模块进行版本控制.
在简单的Maven世界中,
如果您拥有的只是一个Develop和Master分支,那就没关系,但是如何在GitFlow中处理maven版本控制.
master上的版本很容易定义,因为它们将是最终从Release分支创建和发布的版本.
但是一旦代码进入发布分支,您在此处部署了什么版本控制策略?
如果您的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帐户验证用户?
我有许多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的一些例外和持久性行为
Paho的一些最佳实践是什么?
我们在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_VAL1或TYPE1_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_VAL1或TYPE2_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) 我们的后端当前正在使用 KeyCloak 管理客户端 API (Java)
\n然而,我们的流程需要支持以下场景:
\nexecuteActionsEmailAPI 调用并让 Keycloak 向用户发送电子邮件以供他们完成个人资料UPDATE_PROFILE电子邮件时,它包含/login-actions/action-token?key=eyJhbG\xe2\x80\xa6带有操作令牌的链接。所以问题是我是否可以使用 KeyCloak API(或其他一些机制)为 keycloak 领域内的用户生成登录操作 URL,然后我们可以在外部电子邮件模板中使用该 URL 来发送完整的注册电子邮件?
\n突然间,我的应用程序正在使用的数据库似乎已经损坏了.我没有改变数据库的结构,但我今天在我的设备上多次重新部署了应用程序.
它抛出以下异常.
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) 我正在尝试使用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打开).从可用性的角度来看,这也是不可接受的.
我正在寻找比这里概述的解决方案更好的解决方案.
此致,戴维
我正在修改来自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路由作为前缀,这似乎也不对.
任何帮助,将不胜感激.
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)