Portal for ArcGIS 提供了两种登录方式:OAuth 2.0和传统的token登录方式。
OAuth 2.0的登录原理在之前的一篇文章中已经描述,所以今天就不重复了。下面将介绍对于不支持OAuth2.0的应用,如何通过REST API登录Portal for ArcGIS。
其关键是通过ArcGIS REST API中提供的一个生成令牌的接口获得token,然后把token和相关的登录账户信息保存到一个名为esri_auth的cookie中。同时要注意cookie的domain必须和Portal for ArcGIS的访问地址一致,如果不一致,可通过代理页来完成cookie的写入和页面跳转工作。
生成令牌的接口说明如下:
https://<root-url>/generateToken(POST only)
该接口只支持HTTP POST方法。
相关参数为:
参数 | 说明 |
username | 用户名 |
password | 密码 |
client | 只支持取值为referer |
referer | 登录后,跳转的应用基础url |
expiration | token超时设置,默认为60分钟 |
下面为示例代码,这里使用jQuery作为前端JS发送POST请求,实际应用时建议采用后端代码执行方式:
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width">
6 <title>Demo</title>
7 <link rel="stylesheet" href="css/style.css">
8 <script src="components/jquery/dist/jquery.js"></script>
9 <script src="components/jquery-ui/jquery-ui.js"></script>
10 <script src="components/jquery.cookie/jquery.cookie.js"></script>
11 <script src="js/index.js"></script>
12 </head>
13 <body>
14 <p>Name</p>
15 <input id="Name" type="text">
16 <p>Password</p>
17 <input id="Password" type="text">
18 <br>
19 <button>Login</button>
20 <br>
21 <a href="https://webgis40.esrigz.com/portal">Portal</a>
22 </body>
23 </html>
下面是对应的JavaScript代码,实际在请求获得token后,还需要通过REST API请求登录用户的个人信息,包括email、culture、accountId、role,为了简单演示,把这些信息硬编码写在代码中了:
1 $(function () {
2 $("button").click(function () {
3 $.cookie('name','value')
4 let n = $('#Name').val()
5 let p = $('#Password').val()
6 let url = 'https://webgis40.esrigz.com/portal/sharing/rest/generateToken'
7 let redirect = 'https://webgis40.esrigz.com/portal'
8 data = { username: n, password: p, referer: redirect, client: 'referer',f:'json'}
9 $.post(url, data).done((d) => {
10 let tokenHolder = JSON.parse(d)
11 let encode_token = encodeURI(tokenHolder.token)
12 let expires = tokenHolder.expires
13 //console.log(encode_token)
14
15 let auth = { "portalApp": true, "email": "portaladmin", "token": tokenHolder.token, "culture": "en", "region": null, "expires": tokenHolder.expires,"allSSL":false,"accountId":"0123456789ABCDEF","role":"org_admin"}
16
17 $.cookie('esri_auth', JSON.stringify(auth), { path: '/', domain:'webgis40.esrigz.com'})
18 window.location = redirect //支持自动跳转,如果不需要,则屏蔽该行代码。
19 }
20 )
21 })
22 }
23 )