The source code to the civic tech project Öppna Skolplattformen.
Go to file
Erik Hellman d7954587d5 fix: 🐛 fix latest security "fix" 2021-03-25 14:33:57 +01:00
.github/workflows fix: 🐛 Added build step (#38) 2021-01-15 14:21:09 +01:00
lib fix: 🐛 fix latest security "fix" 2021-03-25 14:33:57 +01:00
.babelrc.js Initial commit 2020-12-19 13:37:45 +01:00
.eslintrc.js feat: 🎸 getUser (#19) 2020-12-21 17:01:22 +01:00
.gitignore Fetch wrapper (#29) 2020-12-30 14:39:49 +01:00
.releaserc Login token, logout method and set session cookie (#6) 2020-12-21 09:51:51 +01:00
LICENSE Initial commit 2020-12-19 11:37:37 +01:00
README.md fix: 🐛 Parsning 2021-02-12 13:09:10 +01:00
jest.config.js feat: Ombyggd parsning av nyhetsbrev (#65) 2021-02-14 16:40:36 +01:00
package.json Rebuilt session handling and login (#78) 2021-03-11 09:58:55 +01:00
run.js fix: 🐛 Adjusted cookie handling (#79) 2021-03-11 17:27:26 +01:00
test.md feat: 🎸 Switched to Markdown Extra converter (#58) 2021-02-11 14:30:42 +01:00
tsconfig.json feat: Ombyggd parsning av nyhetsbrev (#65) 2021-02-14 16:40:36 +01:00
yarn.lock Rebuilt session handling and login (#78) 2021-03-11 09:58:55 +01:00

README.md

embedded-api

Since the proxy was blocked (and also deemed a bad idea by some), this is a reboot of the API running in process in the app(s).

Installing

npm i -S @skolplattformen/embedded-api or yarn add @skolplattformen/embedded-api

Calling

Import and init

Since fetch and cookies behave distinctly different in node, react-native and the browser, the concrete implementation of fetch and cookie handler must be injected.

react-native

import init from "@skolplattformen/embedded-api";
import CookieManager from "@react-native-community/cookies";

const api = init(fetch, () => CookieManager.clearAll());

node

import init from "@skolplattformen/embedded-api";
import nodeFetch from "node-fetch";
import fetchCookie from "fetch-cookie/node-fetch";
import { CookieJar } from "tough-cookie";

const cookieJar = new CookieJar();
const fetch = fetchCookie(nodeFetch, cookieJar);

const api = init(fetch, () => cookieJar.removeAllCookies());

Login / logout

api.on("login", async () => {
  // do stuff
  console.log(api.isLoggedIn) // true
  console.log(api.getSessionCookie) // session cookie if you want to save it
  await api.logout()
});
api.on('logout', () => {
  // handle logout
  console.log(api.isLoggedIn) // false
}

const loginStatus = await api.login("YYYYMMDDXXXX");
window.open(
  `https://app.bankid.com/?autostarttoken=${loginStatus.token}&redirect=null`
);

loginStatus.on("PENDING", () => console.log("BankID app not yet opened"));
loginStatus.on("USER_SIGN", () => console.log("BankID app is open"));
loginStatus.on("ERROR", () => console.log("Something went wrong"));
loginStatus.on("OK", () =>
  console.log("BankID sign successful. Session will be established.")
);

Loading data

// Get current user
const user = await api.getUser();

// List children
const children = await api.getChildren();

// Get calendar
const calendar = await api.getCalendar(children[0]);

// Get classmates
const classmates = await api.getClassmates(children[0]);

// Get schedule
import { DateTime } from 'luxon'

const from = DateTime.local()
const to = DateTime.local().plus({ week: 1 })
const schedule = await api.getSchedule(children[0], from, to)

// Get news
const news = await api.getNews(children[0])

// Get menu
const menu = await api.getMenu(children[0])

// Get notifications
const notifications = await api.getNotifications(children[0])

It is possible to resurrect a logged in session by manually setting the session cookie.

const sessionCookie = "some value";

api.setSessionCookie(sessionCookie); // will trigger `on('login')` event and set `.isLoggedIn = true`

Fake user

Login with personal number 12121212121212, 201212121212 or 1212121212 and api will be put into fake mode. Static data will be returned and no calls to backend will be made.

The LoginStatusChecker returned by the login method will have .token set to "fake".

Try it out

  1. Clone and enter repo: git clone git@github.com:kolplattformen/embedded-api.git && cd embedded-api
  2. Install dependencies: yarn
  3. Build package: yarn build
  4. Run example: node run [your personal number]
  5. Sign in with mobile BankID