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 )