ESRI Identity Manager, ESRI JS API 4.8 makes default call to unsupported API to generate token.
ID calls to portal/sharing in stead of portal/sharing/rest/ for token.Thursday, March 28, 2019
Friday, March 22, 2019
Generate ArcGIS Token By URL Request From ArcGIS Portal, Federated Environment , ESRI JS API and Angular snippets
In my custom angular web application, I had to pull the data
from different ArcGIS server environments, say Dev ArcGIS server and Test
ArcGIS server environment, some of my items are directly referred from ArcGIS
server services and some of them are from Enterprise portal referring the
WebMapId and PortalId from both environment (Dev, Test). Servers are in
federated environment.
To pull the data from different ArcGIS server environment,
user must login in each environment. In addition, user must login to get inside
the custom application and Enterprise AD Group was set to authenticate users on
the custom web application and ArcGIS server environments. So, there will be 3
login attempts (1 –application itself, 2- Dev server/portal, 3- Test
server/portal) to use the application, which doesn’t provide good user experience.
To improve the better application workflow, I decided to reduce
the number of logins required in the application and use AD Username and
Password captured during application login to generate token for each ArcGIS
server environment. Here are some reference snippets to generate token from ArcGIS
server and use tokens request parameter in ESRI JS API and Angular.
Step 1: Generate token and store tokens in session
devServerLogin(username, password){
let portalTokenUrl = ....+'/portal/sharing/rest/generateToken'; //Federated evn., use Portal to generate user token.
if(username && password){
this.httpClient.post(tokenUrl, this.getCredentials(username, password), this.getHttpOptions()).subscribe(esriResponse =>{
sessionStorage.setItem('dev_access_token', esriResponse['token']);
sessionStorage.setItem('dev_access_token_expires', esriResponse['expires']);
});;
}
}
private getCredentials(username, password){
let expiration = 720; //1440 -> 60 minute * 24 = 1 day token , 720 -> 12hrs token
let urlReferer = 'https://'+window.location.host+'/';
let urlReferer = 'https://'+window.location.host+'/';
let tokenCredentials = 'username='+username+'&password='+password+'&f=json&expiration='+expiration+'&client=referer&referer='+urlReferer;
return tokenCredentials;
}
private getHttpOptions(){
let httpOptions = {
headers: new HttpHeaders({ 'Content-Type': 'application/x-www-form-urlencoded', }),
withCredentials: true,
};
return httpOptions;
}
Wednesday, November 21, 2018
ArcGIS Server SOI - HandleRESTRequest Parameter limitations
The SOI Rest request handler method -
public byte[] HandleRESTRequest(string Capabilities, string resourceName, string operationName,
string operationInput, string outputFormat, string requestProperties, out string responseProperties)
HandleRESTRequest paramater provides following information inside the method
capabilities Map,Query,Data
resourceName layers/0,
operationName query,
operationInput {"returnZ":false,"returnIdsOnly":false,
"where":"","returnDistinctValues":false,"returnM":false,"returnCountOnly":false,"returnExtentsOnly":false,
"returnTrueCurves":false,"returnGeometry":true,
"spatialRel":"esriSpatialRelIntersects","geometryType":"esriGeometryEnvelope"}, outputFormat json,
requestProperties {"computeETag":true,"ETag":"\"c429a59c\""},
responseProperties {"Content-Type":"text/plain"}
But it has no way of telling service name and layer name ...other than using layer index from resourceName if you want to perform layer specific operation in layers.public byte[] HandleRESTRequest(string Capabilities, string resourceName, string operationName,
string operationInput, string outputFormat, string requestProperties, out string responseProperties)
HandleRESTRequest paramater provides following information inside the method
capabilities Map,Query,Data
resourceName layers/0,
operationName query,
operationInput {"returnZ":false,"returnIdsOnly":false,
"where":"","returnDistinctValues":false,"returnM":false,"returnCountOnly":false,"returnExtentsOnly":false,
"returnTrueCurves":false,"returnGeometry":true,
"spatialRel":"esriSpatialRelIntersects","geometryType":"esriGeometryEnvelope"}, outputFormat json,
requestProperties {"computeETag":true,"ETag":"\"c429a59c\""},
responseProperties {"Content-Type":"text/plain"}
Sunday, August 5, 2018
[Code snippet]: Planet API Image Download Url
from requests.auth import HTTPBasicAuth
import os
import requests
item_id = "20161109_173041_0e0e"
item_type = "PSScene3Band"
os.environ['PLANET_API_KEY'] = '3b711bededf6485a0' #not a real id
asset_type = "visual"
item_url = 'https://api.planet.com/data/v1/item-types/{}/items/{}/assets'.format(item_type, item_id)
# Request a new download URL
result = requests.get(item_url, auth=HTTPBasicAuth(os.environ['PLANET_API_KEY'], ''))
download_url = result.json()[asset_type]['location']
print(download_url)
Thursday, June 14, 2018
Monday, June 11, 2018
[Snippet]: Fetch User Name and Email Address from Windows AD Group using Powershell script.
FetchAdUsers.ps1
#Store users' info in CSV
Get-ADGroupMember -Identity GROUPNAME -Recursive|Get-ADUser -Properties Mail, MemberOf | Select-Object GivenName, Surname, SamAccountName, Mail | Export-csv -path GROUPNAME .csv -NoTypeInformation
#Store users' info in CSV
Get-ADGroupMember -Identity GROUPNAME -Recursive|Get-ADUser -Properties Mail, MemberOf | Select-Object GivenName, Surname, SamAccountName, Mail | Export-csv -path GROUPNAME .csv -NoTypeInformation
Wednesday, May 30, 2018
[Code Snippet] How to a create user in arcgis portal with a custom role?
Create a user or add member in ArcGIS portal with a custom role -
1. Get all custom roles from the portal, I presumed that the portal already has custom roles other than (org_user, org_publisher, org_admin)
from arcgis.gis import *
gis= GIS(portalUrl, userName, password)
allRoles = gis.users.roles.all(max_roles=50)
2. Create a User with Default Role
username="test"
password=''
firstname='test_name'
lastname='test_last'
email='test@test.com'
description = 'Test Account'
role = 'org_publisher'
provider = 'enterprise'
idp_username = 'test'
level = 2
thumbnail = None
newUser = gis.users.create(username, password,firstname,
lastname, email, description, role, provider,
idp_username, level, thumbnail)
3. Update the defualt role to Custom Role - Assign the role object not role name
#Assigning the first role out of many portal roles, as an example
status = newUser.update_role(role=allRoles[0])
print(status)
If role assigned success, the value of status will be True.
Reference:
https://developers.arcgis.com/python/guide/accessing-and-managing-users/
1. Get all custom roles from the portal, I presumed that the portal already has custom roles other than (org_user, org_publisher, org_admin)
from arcgis.gis import *
gis= GIS(portalUrl, userName, password)
allRoles = gis.users.roles.all(max_roles=50)
2. Create a User with Default Role
username="test"
password=''
firstname='test_name'
lastname='test_last'
email='test@test.com'
description = 'Test Account'
role = 'org_publisher'
provider = 'enterprise'
idp_username = 'test'
level = 2
thumbnail = None
newUser = gis.users.create(username, password,firstname,
lastname, email, description, role, provider,
idp_username, level, thumbnail)
3. Update the defualt role to Custom Role - Assign the role object not role name
#Assigning the first role out of many portal roles, as an example
status = newUser.update_role(role=allRoles[0])
print(status)
If role assigned success, the value of status will be True.
Reference:
https://developers.arcgis.com/python/guide/accessing-and-managing-users/
Friday, May 25, 2018
[Code Snippet] Find Custom Role of users that are in ArcGIS portal - ArcGIS
from arcgis.gis import *
self.portalInfo = GIS(self.portalUrl, self.userName, self.password)
self.portalUsers = self.portalInfo.users.search('')
users = self.portalUsers
roleManager = arcgis.gis.RoleManager(self.portalInfo)
roles = roleManager.all()
for user in users:
if hasattr(user,'roleId'):
for role in roles:
if(user.roleId == role.role_id):
print(user.username,user.role,role.name)
Remote debug environment setup for ArcGIS server extensions- SOE and SOI
In order to debug the ArcGIS server extension SOE/SOI from your development machine, you have to follow 3 steps:
1. Enable remote debug ( Presumption is your development machine and GIS server are different machines)
2. Enable sever extension for debug
3. Attach debugger to the process running the service
Download and install the remote debuggin tools from - https://docs.microsoft.com/en-us/visualstudio/debugger/remote-debugging
A. Enable remote debug
1. Download and configure Remote tools on the development
a. Find msvsmon.exe in the directory matching your version of Visual Studio. For Visual Studio 2015:
Program Files\Microsoft Visual Studio 14.0\Common7\IDE\Remote Debugger\x64\msvsmon.exe
(x64 can debug both x86 and x64 but x86 can only debugs x86)
2. On the remote computer, copy Remote Debugger folder from development machine and put in C:\ drive. Then, run msvsmon.exe
3. The msvsmon.exe output terminal shows
Wednesday, April 11, 2018
Code snippet: Get DateTime from UTC timestamp in ArcGIS Online
ArcGIS Online stores all date values in UTC. A short snippet to convert UTC timestamp to DateTime using Python.
from datetime import datetime
utcTimeStamp = 1472218452855
date = datetime.fromtimestamp(utcTimeStamp / 1e3)
print(date)
output: 2016-08-26 09:34:12.855000
from datetime import datetime
utcTimeStamp = 1472218452855
date = datetime.fromtimestamp(utcTimeStamp / 1e3)
print(date)
output: 2016-08-26 09:34:12.855000
Subscribe to:
Posts
(
Atom
)