Horizon使用JSON Web Tokens实现用户的认证,不管你是不是使用Horizon进行开发,你都应该了解一下jwt,它是一个开放的工业标准。根据你的应用类型,你可以选择三种不同类型的认证机制,通过传递authType
参数给Horizon object constructor。
下面来介绍一下三种认证机制:
-
unauthenticated
:在所有用户中共享一个token,不会在Horizon users表中创建记录。这实际上绕过了Horizon的认证系统,最适用于那些不需要存储任何用户数据的应用。 -
anonymous
:给每一个用户创建唯一的token,并在users表中创建记录,它能通过生成的token进行认证,token存储在客户端的localStorage中。你的应用需要提示输入用户名和密码。 -
token
:通过第三方OAuth服务验证用户信息,同anonymous
类似,返回的JWT会存储在客户端。
使用本地验证
第一种认证机制是unauthenticated。同一个web token在所有未认证用户中共享。使用如下方式创建连接:
const horizon = Horizon({ authType: 'unauthenticated' });
这是默认的认证机制,它不能区分用户的权限和数据。
Anonymous
第二种认证机制是anonymous。如果anonymous认证开启,任何用户请求匿名认证会被给予一个新的JWT,不需要其他形式的确认。服务器会使用这个JWT来为Users表创建记录。除了用户待会儿把这个JWT传回来,没有其他的认证方法。一般做法是把jwt存储在localStorage中,随着之后请求自动传回。
const horizon = Horizon({ authType: 'anonymous' });
这类认证非常有用,如果你要区分用户,但不想使用一个流行的第三方
认证服务的话。这本质上就是一个「创建用户账户」或者「注册」的过程。
使用OAuth
使用OAuth,对于每个OAuth服务提供者,你的应用需要设定一个Client ID和secret。目前Horizon支持的OAuth服务有:
每个服务商都会让你注册应用,给你Horizon所需要的客户端数据。
配置服务器
为了使用Horizon的OAuth,你需要配置一个TLS证书,通过https传输资源,你可以在hz serve
命令后添加flag(--key-file
和--cert-file
),或者在.hz/config.toml
文件中指定证书。
如果不配置TLS,那么开启OAuth时会有如下错误提示:
serve failed with Error: Could not access file "./horizon-key.pem" for running HTTPS server: Error: ENOENT: no such file or directory, open '/Users/username/Github/horizon/example_app/horizon-key.pem'
我们可以使用hz create-cert
命令来生成自签名的证书。
> openssl req -x509 -nodes -batch -newkey rsa:2048 -keyout horizon-key.pem -out horizon-cert.pem -days 365
Generating a 2048 bit RSA private key
...............................................................................................................+++
.......................................................................................................................+++
writing new private key to 'horizon-key.pem'
然后将config.toml
中key和cert设置如下。
secure = true
key_file = "horizon-key.pem"
cert_file = "horizon-cert.pem"
你需要在.hz/config.toml
中指定OAuth服务商的client_id
和client_secret
,这里以Github OAuth为例,添加配置数据:
# [auth.facebook]
# id = "000000000000000"
# secret = "00000000000000000000000000000000"
#
# [auth.google]
# id = "00000000000-00000000000000000000000000000000.apps.googleusercontent.com"
# secret = "000000000000000000000000"
#
# [auth.twitter]
# id = "0000000000000000000000000"
# secret = "00000000000000000000000000000000000000000000000000"
[auth.github]
id = "your_client_id"
secret = "your_client_secret"
你需要修改其他config参数运行
hz serve
,详见Horizon Server。
我们可以启动服务器来验证配置,运行命令hz serve
,然后访问https://localhost:8181/horizon/auth_methods
。你可以看到一系列当前可用的认证选项。比如这里你可以看到Github在可用认证方法的对象里:
{
github: "/horizon/github"
}
配置客户端程序
在客户端初始化时,使用authType: 'token'
,然后使用authEndpoint()
这个命令来为你获取OAuth服务商的endpoint,并且将用户跳转至那个URL。
const horizon = Horizon({ authType: 'token' });
if (!horizon.hasAuthToken()) {
horizon.authEndpoint('github').subscribe((endpoint) => {
window.location.pathname = endpoint;
});
} else {
// We have a token already, do authenticated Horizon stuff here
}
清除tokens
你可以使用clearAuthTokens()
来清除localStorage中的所有tokens:
// Note the 'H'
Horizon.clearAuthTokens();
获取session数据
你可以通过Horizon.hasAuthToken
方法检查一个用户是否已认证,并且通过Horizon.currentUser
来获取用户信息。更多信息请参照官方文档中的Users and groups。