{"_id":"@cambridge-pte/adonisjs6-ally-okta","name":"@cambridge-pte/adonisjs6-ally-okta","dist-tags":{"latest":"2.0.0"},"versions":{"2.0.0":{"name":"@cambridge-pte/adonisjs6-ally-okta","description":"Custom adonisjs6/ally provider for Okta.","version":"2.0.0","engines":{"node":">=20.6.0"},"type":"module","exports":{".":{"import":"./build/index.js","types":"./build/index.d.ts"},"./types":{"import":"./build/src/types/okta.js","types":"./build/src/types/okta.d.ts"},"./okta_driver":{"import":"./build/src/okta_driver.js","types":"./build/src/okta_driver.d.ts"}},"scripts":{"clean":"del-cli build","typecheck":"tsc --noEmit","lint":"eslint .","format":"prettier --write .","prebuild":"npm run lint && npm run clean","build":"tsc","release":"np","prepublishOnly":"npm run build"},"keywords":["ally","okta","adonis","adonisjs","oauth2","social-auth"],"author":{"name":"Reynald Eris Salas"},"license":"MIT","dependencies":{"@poppinss/utils":"^6.7.1"},"devDependencies":{"@adonisjs/assembler":"^7.8.2","@adonisjs/ally":"^5.1.1","@adonisjs/core":"^6.19.0","@adonisjs/eslint-config":"2.0.0-beta.7","@adonisjs/prettier-config":"^1.4.0","@adonisjs/tsconfig":"^1.3.0","@japa/assert":"^3.0.0","@japa/runner":"^3.1.4","@swc/core":"^1.6.3","@types/node":"^20.14.5","del-cli":"^5.1.0","eslint":"^9.15.0","np":"^10.0.6","prettier":"^3.3.2","ts-node-maintained":"^10.9.4","typescript":"^5.4.5"},"peerDependencies":{"@adonisjs/ally":"^5.1.1","@adonisjs/core":"^6.19.0"},"prettier":"@adonisjs/prettier-config","publishConfig":{"access":"public","tag":"latest"},"repository":{"type":"git","url":"git+https://github.com/cambridge-pte/adonisjs6-ally-okta.git"},"bugs":{"url":"https://github.com/cambridge-pte/adonisjs6-ally-okta/issues"},"homepage":"https://github.com/cambridge-pte/adonisjs6-ally-okta#readme","np":{"message":"chore(release): %s","tag":"latest","branch":"main","anyBranch":false,"tests":false},"_id":"@cambridge-pte/adonisjs6-ally-okta@2.0.0","gitHead":"1e874c9d29f131be1611325c69ef2c9f9a0c0afe","_nodeVersion":"20.19.4","_npmVersion":"10.8.2","dist":{"integrity":"sha512-5uKKR7QnFVhzVuvl2fzk/J1MfyIcuq7ttflyzjc/r2viHGrAvGOA2XpMveb170SJpVPc26zvGVa1AWDw2gNY3g==","shasum":"ae22ba3d3a15f9e677ac59c7b5bbf7a69eaabb77","tarball":"https://registry.npmjs.org/@cambridge-pte/adonisjs6-ally-okta/-/adonisjs6-ally-okta-2.0.0.tgz","fileCount":13,"unpackedSize":16453,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHTN7GvmD/KKnghVIoK4N+wgLcqVOstfeBIZb6q1P7vFAiEAlw0UU6Tp1h+jY8AWMjq3VPWseXr3N+fLbWHaCGYscS8="}]},"_npmUser":{"name":"rherreracup","email":"russel.herrera@cambridge.org"},"directories":{},"maintainers":[{"name":"moris00","email":"moris.mascarinas@cambridge.org"},{"name":"jsunico-cupa","email":"renzo.sunico@cambridge.org"},{"name":"rherreracup","email":"russel.herrera@cambridge.org"},{"name":"crugeria","email":"christian.rugeria@cambridge.org"},{"name":"educationtechnologysolutionsteam","email":"educationtechnologysolutionsteam@cambridge.org"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/adonisjs6-ally-okta_2.0.0_1758813619834_0.46975022230232244"},"_hasShrinkwrap":false}},"time":{"created":"2025-09-25T15:20:19.729Z","2.0.0":"2025-09-25T15:20:20.043Z","modified":"2025-09-25T15:20:20.446Z"},"maintainers":[{"name":"moris00","email":"moris.mascarinas@cambridge.org"},{"name":"jsunico-cupa","email":"renzo.sunico@cambridge.org"},{"name":"rherreracup","email":"russel.herrera@cambridge.org"},{"name":"crugeria","email":"christian.rugeria@cambridge.org"},{"name":"educationtechnologysolutionsteam","email":"educationtechnologysolutionsteam@cambridge.org"}],"description":"Custom adonisjs6/ally provider for Okta.","homepage":"https://github.com/cambridge-pte/adonisjs6-ally-okta#readme","keywords":["ally","okta","adonis","adonisjs","oauth2","social-auth"],"repository":{"type":"git","url":"git+https://github.com/cambridge-pte/adonisjs6-ally-okta.git"},"author":{"name":"Reynald Eris Salas"},"bugs":{"url":"https://github.com/cambridge-pte/adonisjs6-ally-okta/issues"},"license":"MIT","readme":"# AdonisJS 6 Ally Okta Provider\n\nA custom OAuth2 provider for [AdonisJS Ally](https://docs.adonisjs.com/guides/auth/social) that adds Okta authentication support.\n\n## Getting Started\n\n### Installation\n\nInstall the package using your preferred package manager:\n\n```bash\nnpm install @cambridge-pte/adonisjs6-ally-okta\n```\n\n```bash\nyarn add @cambridge-pte/adonisjs6-ally-okta\n```\n\n```bash\npnpm add @cambridge-pte/adonisjs6-ally-okta\n```\n\n### Configuration\n\nConfigure the package by running:\n\n```bash\nnode ace configure @cambridge-pte/adonisjs6-ally-okta\n```\n\n### Environment Variables\n\nAdd the required environment variables to your `.env` file:\n\n```env\nOKTA_DRIVER_CLIENT_ID=your_okta_client_id\nOKTA_DRIVER_CLIENT_SECRET=your_okta_client_secret\nOKTA_DRIVER_AUTHORIZE_URL=https://your-domain.okta.com/oauth2/default/v1/authorize\nOKTA_DRIVER_USER_INFO_URL=https://your-domain.okta.com/oauth2/default/v1/userinfo\nOKTA_DRIVER_TOKEN_URL=https://your-domain.okta.com/oauth2/default/v1/token\nOKTA_DRIVER_RESPONSE_TYPE=code\nOKTA_DRIVER_SCOPES=openid email profile\n```\n\n### Ally Configuration\n\nUpdate your `config/ally.ts` file to include the Okta provider:\n\n```typescript\nimport { defineConfig } from '@adonisjs/ally'\nimport { OktaDriverService } from '@cambridge-pte/adonisjs6-ally-okta'\nimport env from '#start/env'\n\nconst allyConfig = defineConfig({\n  // ... other providers like github, google, etc\n\n  okta: OktaDriverService({\n    clientId: env.get('OKTA_DRIVER_CLIENT_ID'),\n    clientSecret: env.get('OKTA_DRIVER_CLIENT_SECRET'),\n    callbackUrl: `${env.get('APP_URL')}/auth/okta/callback`,\n    authorizeUrl: env.get('OKTA_DRIVER_AUTHORIZE_URL'),\n    accessTokenUrl: env.get('OKTA_DRIVER_TOKEN_URL'),\n    userInfoUrl: env.get('OKTA_DRIVER_USER_INFO_URL'),\n    scopes: env.get('OKTA_DRIVER_SCOPES'),\n    responseType: env.get('OKTA_DRIVER_RESPONSE_TYPE'),\n  }),\n})\n\nexport default allyConfig\n\n// TypeScript module augmentation for proper type inference\ndeclare module '@adonisjs/ally/types' {\n  interface SocialProviders extends InferSocialProviders<typeof allyConfig> {}\n}\n```\n\n## Usage\n\n### Basic Authentication Flow\n\nCreate routes for handling the OAuth flow:\n\n```typescript\n// start/routes.ts\nimport router from '@adonisjs/core/services/router'\n\nrouter.get('/okta/callback', '#controllers/oidc_controller.callback')\n```\n\nIn your controller:\n\n```typescript\nimport type { HttpContext } from '@adonisjs/core/http'\nimport User from '#models/user'\n\n// modify as needed\nconst API_TOKEN_EXPIRY = '1d'\n\nexport default class OIDCController {\n  async callback({ ally, auth, response }: HttpContext) {\n    const okta = ally.use('okta')\n\n    if (okta.accessDenied()) {\n      return response.badRequest({ error: 'Access was denied' })\n    }\n\n    if (okta.stateMisMatch()) {\n      return response.badRequest({ error: 'Request expired. Retry again' })\n    }\n\n    if (okta.hasError()) {\n      return response.badRequest({ error: okta.getError() })\n    }\n\n    try {\n      const { token: accessToken } = await okta.accessToken()\n      const { name: userName, email } = await okta.userFromToken(accessToken)\n      const user = await User.updateOrCreate(\n        {\n          email,\n        },\n        {\n          fullName: userName,\n          email,\n        }\n      )\n\n      const token = await auth.use('user').login(user, {\n        expiresIn: API_TOKEN_EXPIRY,\n      })\n\n      return response.json({\n        success: true,\n        message: 'Authentication successful',\n        data: {\n          token,\n          userName,\n          email,\n        },\n      })\n    } catch (error) {\n      return response.status(500).json({\n        success: false,\n        error: error.message,\n      })\n    }\n  }\n}\n```\n\n> **Note:** This example assumes you're handling the initial OAuth redirect from your frontend application or another service. The callback route processes the authorization code returned by Okta after user authentication.\n\n### Available Scopes\n\nThe provider supports the following Okta scopes:\n\n- `openid` - Required for OpenID Connect\n- `email` - Access to email address\n- `profile` - Access to profile information\n- `address` - Access to address information\n- `phone` - Access to phone number\n- `offline_access` - Refresh token support\n- `groups` - Access to group membership\n\n### User Object\n\nThe returned user object contains:\n\n```typescript\n{\n  id: string // Okta user ID (sub claim)\n  name: string // Full name\n  nickName: string // Display name\n  email: string // Email address (from preferred_username)\n  avatarUrl: string // Profile picture URL\n  emailVerificationState: 'verified' | 'unverified'\n  original: object // Raw response from Okta\n}\n```\n\n## TypeScript Support\n\nThis package includes full TypeScript support with proper type definitions for:\n\n- Configuration options\n- User object structure  \n- Available scopes\n- Driver methods\n\n### Setting up TypeScript Support\n\nThe module augmentation should be added to your `config/ally.ts` file as shown above:\n\n```typescript\n// In your config/ally.ts file\ndeclare module '@adonisjs/ally/types' {\n  interface SocialProviders extends InferSocialProviders<typeof allyConfig> {}\n}\n```\n\nThis enables full TypeScript intellisense for the Okta driver, allowing you to use:\n\n```typescript\n// In your controllers\nconst okta = ally.use('okta') // Properly typed as OktaDriver\nawait okta.user() // Full method autocomplete and type safety\n```\n\n### Importing Types\n\nImport types when needed for configuration or custom implementations:\n\n```typescript\nimport type { OktaDriverConfig, OktaDriverScopes } from '@cambridge-pte/adonisjs6-ally-okta/types'\n```\n\n## License\n\nMIT License - see the [LICENSE.md](LICENSE.md) file for details.\n","readmeFilename":"README.md","_rev":"1-dae6debe4790b7227ee965ee16b50458"}