# Security Concerns Regarding User Access to Tags in Perspective

**URL:** <https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582>\
**Category:** Ignition\
**Tags:** scripting, perspective\
**Created:** [October 19, 2025, 10:25am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582 "2025-10-19T10:25:30Z")\
**Posts on this page:** 15\
**Page:** 1

<div class="post-metadata">

**Author:** ![diamond](https://avatars.discourse-cdn.com/v4/letter/d/e79b87/32.png) [@diamond](https://forum.inductiveautomation.com/u/diamond)\
**Post date:** [October 19, 2025, 10:25am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/1 "2025-10-19T10:25:30Z")

</div>

Hello,

I have a **tag that stores a token** required to upload data to a cloud storage system. This token refreshes every hour. I also have a Perspective button that executes a script using that token to generate a temporary URL, which is then used to display a file.

My concern is security — I don’t want the end user to have any access to the tag or token. At the same time, the user needs read privileges for the script to work.

**Is there any way for the user to access the value of that tag if it’s not displayed anywhere?** Should I consider a different approach?

Thanks!

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [October 19, 2025, 1:27pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/2 "2025-10-19T13:27:19Z")

</div>

It isn't a question of **display**. If you bind that tag to a Perspective property (anywhere), and that property isn't marked as **private** , then you are publishing that tag to the browser. Also for any script assignment to a Perspective property. A competent coder can examine browser state to find it.

If you are using `system.tag.readBlocking()` in your script, then you are safe, as scripts run entirely in the gateway.

---

<div class="post-metadata">

**Author:** ![diamond](https://avatars.discourse-cdn.com/v4/letter/d/e79b87/32.png) [@diamond](https://forum.inductiveautomation.com/u/diamond)\
**Post date:** [October 19, 2025, 5:15pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/3 "2025-10-19T17:15:29Z")

</div>

> [@pturmel](#):
>
> If you are using `system.tag.readBlocking()` in your script, then you are safe, as scripts run entirely in the gateway.

I have the tag set to _private_ and I’m accessing it through `system.tag.readBlocking()`. Why does the user still needs to be within the required security level for `readBlocking` to return a value? If `readBlocking` runs on the gateway, I don’t get why Ignition is checking the user security level.

As for the example:

- My token tag (private): `[default]Tokens/mytoken`
- Scripting library function:

```python
# project.library.cloud
def getFileUrl(file_id):
    token = system.tag.readBlocking(["[default]Tokens/mytoken"])[0].value
    return build_url(file_id, token)

```

- Perspective button:

```python
url = cloud.getFileUrl(self.view.params.file_id)
#do something with the url

```

Thank you

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [October 19, 2025, 6:31pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/4 "2025-10-19T18:31:45Z")

</div>

> [@diamond](#):
>
> I have the tag set to _private_

What does this mean? (In my comment above, I was referring to setting a Perspective **property** to private, if you were using a tag binding.)

> [@diamond](#):
>
> If `readBlocking` runs on the gateway, I don’t get why Ignition is checking the user security level.

The whole point of tag security is to provide a barrier that UI programmers don't have to think about. Ignition will stop the use of tags from UI events that don't have the appropriate access.

Perhaps you should be caching your token in a library script module top-level dictionary or similar persistent variable.

---

<div class="post-metadata">

**Author:** ![diamond](https://avatars.discourse-cdn.com/v4/letter/d/e79b87/32.png) [@diamond](https://forum.inductiveautomation.com/u/diamond)\
**Post date:** [October 19, 2025, 7:44pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/5 "2025-10-19T19:44:16Z")

</div>

> [@pturmel](#):
>
> What does this mean?

Under tag security, I’ve configured `read permissions` to be allowed only for my “admin” security level (which the Perspective user does not belong to). From my understanding, `readBlocking` should not check whether the user is within that security level, since it executes on the gateway side.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [October 19, 2025, 9:59pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/6 "2025-10-19T21:59:26Z")

</div>

Perspective scope is a subset of Gateway scope, and will enforce tag permissions. My presumption in my first comment was that you weren't using tag permissions.

(Hiding things from a designer is pointless--designer access restrictions are only guardrails once logged in.)

---

<div class="post-metadata">

**Author:** ![diamond](https://avatars.discourse-cdn.com/v4/letter/d/e79b87/32.png) [@diamond](https://forum.inductiveautomation.com/u/diamond)\
**Post date:** [October 20, 2025, 6:48am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/7 "2025-10-20T06:48:58Z")

</div>

> [@pturmel](#):
>
> Perspective scope is a subset of Gateway scope, and will enforce tag permissions. My presumption in my first comment was that you weren't using tag permissions.

So, setting the tag’s `read permissions` to _public_ is safe as long as the tag isn’t bound anywhere, right?

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [October 20, 2025, 10:49am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/8 "2025-10-20T10:49:09Z")

</div>

Neither bound nor assigned to a Perspective property. If you really want to avoid exposure, use a script top-level variable to hold your token.

---

<div class="post-metadata">

**Author:** ![paul-griffith](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/paul-griffith/32/37249_2.png) [@paul-griffith](https://forum.inductiveautomation.com/u/paul-griffith)\
**Post date:** [October 20, 2025, 4:11pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/9 "2025-10-20T16:11:47Z")

</div>

> [@pturmel](#):
>
> If you really want to avoid exposure, use a script top-level variable to hold your token.

I'll just echo this. If you're concerned about exposure, why use a tag _at all_?

---

<div class="post-metadata">

**Author:** ![diamond](https://avatars.discourse-cdn.com/v4/letter/d/e79b87/32.png) [@diamond](https://forum.inductiveautomation.com/u/diamond)\
**Post date:** [October 27, 2025, 10:49am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/10 "2025-10-27T10:49:00Z")

</div>

I can use the same token every 60 minutes (across the entire gateway and for all clients) before generating another one. Creating a new token for each request would be inefficient. I can't think of a cleaner way to manage it than with a tag that refreshes every hour.

---

<div class="post-metadata">

**Author:** ![lrose](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/lrose/32/62724_2.png) [@lrose](https://forum.inductiveautomation.com/u/lrose)\
**Post date:** [October 27, 2025, 11:01am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/11 "2025-10-27T11:01:33Z")

</div>

> [@diamond](#):
>
> I can't think of a cleaner way to manage it than with a tag that refreshes every hour

A script top-level variable to hold the token, and a Gateway Scheduled Event (Or a Timer Event if you don't care about the update being on the hour). The gateway event would call a project library script which updates the variable.

---

<div class="post-metadata">

**Author:** ![diamond](https://avatars.discourse-cdn.com/v4/letter/d/e79b87/32.png) [@diamond](https://forum.inductiveautomation.com/u/diamond)\
**Post date:** [October 27, 2025, 11:14am UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/12 "2025-10-27T11:14:33Z")

</div>

I’ll try that, thanks!

---

<div class="post-metadata">

**Author:** ![Chris\_Bingham](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@Chris\_Bingham](https://forum.inductiveautomation.com/u/Chris_Bingham)\
**Post date:** [October 28, 2025, 7:24pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/13 "2025-10-28T19:24:18Z")

</div>

> [@lrose](#):
>
> A script top-level variable to hold the token

Spanning multiple projects of a gateway might benefit from a solution that does not utilize a project-based resource.

---

<div class="post-metadata">

**Author:** ![pturmel](https://sea1.discourse-cdn.com/inductiveautomation/user_avatar/forum.inductiveautomation.com/pturmel/32/3295_2.png) [@pturmel](https://forum.inductiveautomation.com/u/pturmel)\
**Post date:** [October 28, 2025, 7:32pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/14 "2025-10-28T19:32:36Z")

</div>

> [@Chris\_Bingham](#):
>
> Spanning multiple projects of a gateway

Inheritance plus careful use of a gateway-wide persistent dictionary is the answer to that, too.

---

<div class="post-metadata">

**Author:** ![Chris\_Bingham](https://avatars.discourse-cdn.com/v4/letter/c/e5b9ba/32.png) [@Chris\_Bingham](https://forum.inductiveautomation.com/u/Chris_Bingham)\
**Post date:** [October 28, 2025, 9:22pm UTC](https://forum.inductiveautomation.com/t/security-concerns-regarding-user-access-to-tags-in-perspective/111582/15 "2025-10-28T21:22:31Z")

</div>

> [@pturmel](#):
>
> Inheritance plus **careful** use of a gateway-wide persistent dictionary is the answer to that, too.

My emphasis added.
