twilio
建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!
今天,不到30秒左右的时间,我就能建立一个Twilio帐户并使用httpie向自己发送一条短信。 再花几分钟的时间(少于5分钟),我有一个Spring Boot应用程序在做同样的事情。
在大约同样的五分钟内,您可以使用Stormpath的身份管理作为服务平台进行设置,并学习热衷于身份验证。
我们真正生活在非我的计算机(云)服务的黄金时代。
您可以想象在过去15年中使用计算机或其他设备所做的任何事情,现在您可以注册并在几分钟内获得概念证明。 我记得大约在2007年的某个时候(发布iPhone 1之后)与SMS经纪人进行了交谈。 在完成一捆文书工作之后,等待了大约四个月的时间,并且花了大笔钱,我们准备使用SMS网关编写代码。 那时,这是一些不可思议的东西。
曾经尝试推出自己的身份管理吗? 你给哈希加盐了吗? 或者,只需接受它-您与当时的其他所有人一样以纯文本形式存储密码。
在本文中,我们将把Stormpath和Twilio放在一起。 情况如下:当用户从新设备登录时,我们希望向他们发送一条SMS通知以告知他们。 今天,这是使人们了解其帐户活动的一种常见做法。 如果我收到新地址登录的通知,但不是我,那么我知道我的帐户已被盗用。
为了演示的目的,我们将考虑从新设备访问新的IP地址。
这篇文章的代码可以在这里找到。
设置风暴路径
第一步是创建一个Stormpath帐户。 您可以在此处关注我们的快速入门文档。 这些是基本步骤:
- 在Stormpath.com注册
- 点击确认电子邮件中的链接
- 创建一个API密钥以用于API访问(将其保存到:
~/.stormpath/apiKey.properties
)
设置Stormpath Spring Boot集成
此示例的源代码可以在此处找到。
现在,不用担心Twilio的东西-默认情况下它是禁用的。 在下一部分中,我们将集成并启用Twilio。
通过Stormpath Spring Boot集成,可以轻松地在用户登录之前和之后触发其他操作。这是我们以后用来发送Twilio消息的机制。 现在,我们仅要确保登录后处理程序正在运行。
要使用Stormpath Spring Boot集成,您只需要包含一个依赖项:
<dependency><groupId>com.stormpath.spring</groupId><artifactId>stormpath-thymeleaf-spring-boot-starter</artifactId><version>${stormpath.version}</version>
</dependency>
在这种情况下,我们将使用Spring Boot + Web MVC + Thymeleaf集成,以便我们可以返回Thymeleaf模板。
要设置我们的postLoginHandler
,我们只需要创建一个暴露一个bean的Spring Boot配置:
@Configuration
public class PostLoginHandler{...@Bean@Qualifier("loginPostHandler")public WebHandler defaultLoginPostHandler() {return (HttpServletRequest request, HttpServletResponse response, Account account) -> {log.info("Hit default loginPostHandler with account: {}", account.getEmail());return true;};}
}
您可以像这样启动Spring Boot应用程序:
mvn clean install
mvn spring-boot:run
现在,您可以浏览到: http://localhost:8080/register
在Stormpath中创建一个帐户。 然后,您可以浏览到: http://localhost:8080/login
。 您应该在日志输出中看到以下内容:
2016-09-14 22:37:18.078 ... : Hit default loginPostHandler with account: micah@stormpath.com
晕! 我们的登录后挂钩正在运行。
在此示例中,我们正在建模的用例是每当用户从新位置登录时向用户发送文本消息(SMS)。 为此,我们需要用户的电话号码。 我们还需要存储他们从其登录的位置的数组,以便我们确定他们是否从新位置登录。
输入Stormpath CustomData
。 我们很早就知道我们无法捕获客户可能拥有的用户数据的所有用例。 因此,我们为每个一流的Stormpath对象(包括用户帐户)附加了10MB的自由格式JSON数据。 那就是CustomData
。
我们像这样存储用户的信息:
{"loginIPs": ["0:0:0:0:0:0:0:1","104.156.228.126","104.156.228.136"],"phoneNumber": "+15556065555"
}
这是Stormpath管理控制台中的外观:
一旦我们将Twilio应用于组合中,我们将回到如何设置CustomData
方式。
设置Twilio
Twilio的快速入门可以使您快速启动并运行。
基本步骤如下:
- 输入一些基本的注册信息
- 输入你的电话号码
- 提供Twilio电话号码
- 测试您可以从Twilio电话号码向您的电话号码发送消息
确保您运行测试并且可以发送消息。 您可以使用curl或httpie从命令行自己进行测试 :
http -f POST \
https://api.twilio.com/2010-04-01/Accounts/<account sid>/Messages.json \
To=<recipient +1...> From=<your twilio phone # - +1...> Body="Hello there..." \
--auth <account sid>:<auth token>
现在您知道可以使用您的Twilio帐户了,将它作为依赖项添加到Spring Boot应用程序中很容易:
<dependency><groupId>com.twilio.sdk</groupId><artifactId>twilio-java-sdk</artifactId><version>(6.0,6.9)</version>
</dependency>
绑在一起
之前,我们将Spring Boot应用程序设置为在用户成功登录后执行一项操作。该操作只是为了记录一些信息。 现在,我们将集成使用相同的登录后处理程序发送Twilio消息的功能。
@Bean
@Qualifier("loginPostHandler")
public WebHandler twilioLoginPostHandler() {return (HttpServletRequest request, HttpServletResponse response, Account account) -> {log.info("Account Full Name: " + account.getFullName());CustomData customData = account.getCustomData();String toNumber = (String) customData.get(phoneNumberIdentifier);List<String> loginIPs = getLoginIPs(customData);String ipAddress = getIPAddress(request);if (loginIPs.contains(ipAddress)) {// they've already logged in from this locationlog.info("{} has already logged in from: {}. No message sent.", account.getEmail(), ipAddress);} else {boolean messageSent = TwilioLoginMessageBuilder.builder().setAccountSid(twilioAccountSid).setAuthToken(twilioAuthToken).setFromNumber(twilioFromNumber).setToNumber(toNumber).send("New login for: " + account.getEmail() + ", from: " + ipAddress);// only save the ip address if the twilio message was successfully sentif (messageSent) {saveLoginIPs(ipAddress, loginIPs, customData);}}return true;};
}
第8行和第9行检索用户的电话号码和用户以前登录过的地址的列表。 它从用户的CustomData
提取此信息。
假设他们正在从新位置登录,则第18行将新地址保存回CustomData
,第20行触发Twilio消息。
TwilioLoginMessageBuilder
在示例中定义,并使用一个流畅的界面。
上面第26行使用的send
方法首先检查以确保正确配置了Twilio,如果是,则尝试发送消息:
TwilioRestClient client = new TwilioRestClient(accountSid, authToken);List<NameValuePair> params = new ArrayList<>();
params.add(new BasicNameValuePair("To", toNumber));
params.add(new BasicNameValuePair("From", fromNumber));
params.add(new BasicNameValuePair("Body", msg));MessageFactory messageFactory = client.getAccount().getMessageFactory();
try {Message message = messageFactory.create(params);log.info("Message successfuly sent via Twilio. Sid: {}", message.getSid());return true;
} catch (TwilioRestException e) {log.error("Error communicating with Twilio: {}", e.getErrorMessage(), e);return false;
}
让我们启动该应用程序,看看它的实际效果!
mvn clean installTWILIO_ACCOUNT_SID=<your twilio account sid> \
TWILIO_AUTH_TOKEN=<your twilio auth token> \
TWILIO_FROM_NUMBER=<your twilio phone number> \
TWILIO_ENABLED=true \
java -jar target/*.jar
点击前门http://localhost:8080
,您就有机会登录。如果查看日志,您会发现第一次登录时,您没有收到任何消息,因为没有您备案的电话号码。
2016-09-15 16:48:31.621 INFO: Account Full Name: micah silverman
2016-09-15 16:48:31.750 WARN: No toNumber set. Cannot proceed.
接下来要做的是设置电话号码:
现在,您可以注销并再次登录,您应该会收到Twilio通知:
2016-09-15 16:53:44.599 INFO: Account Full Name: micah silverman
2016-09-15 16:53:46.080 INFO: Message successfully sent via Twilio. Sid: SM9cd7fdfa3f8f463dbdd8f16662c13b5b
协同增效!
在本文中,我们采用了Stormpath的登录后处理程序功能,并将其与Twilio的SMS功能结合使用,以产生新的功能,这要比这两个平台分别可以完成的功能大。
绝对是服务的黄金时代。
在本文的代码存储库中,还使用了更多的Spring Boot魔术,包括基于配置设置动态加载defaultLoginPostHandler
或twilioLoginPostHandler
。 要使用Twilio处理程序,只需在application.properties
文件中设置twilio.enabled=true
属性。
现在,继续将一些服务粘合在一起,以获得乐趣和收益!
学到更多
有兴趣了解更多有关使用Spring Boot和Stormpath进行用户身份验证的信息吗? 我们还有其他一些很棒的资源可供您查看:
- Spring Boot和Stormpath的OAuth 2.0令牌管理
- 使用Spring Boot和Heroku在20分钟内完成Java的单点登录
- 5个构建Spring Boot API的实用技巧
建筑物身份管理,包括身份验证和授权? 尝试Stormpath! 我们的REST API和强大的Java SDK支持可以消除您的安全风险,并且可以在几分钟内实现。 注册 ,再也不会建立auth了!
翻译自: https://www.javacodegeeks.com/2016/10/identity-management-spring-boot-twilio-stormpath-15-minutes.html
twilio